基本理解
#include <stdio.h>
#include <windows.h>
int main(){
SetConsoleOutputCP(65001);
int var=20;
int p=var;
printf("%d\n",var);
printf("%d\n",p);
printf("%p\n",&var);
printf("%p\n",&p);
return 0;
}
%p是指针的值的意思
结果看 var和p的值虽然一样,但是两个变量是指向两个内存地址。
那如果改变var变量的值
#include <stdio.h>
#include <windows.h>
int main(){
SetConsoleOutputCP(65001);
int var=20;
int p=var;
printf("%d\n",var);
printf("%d\n",p);
printf("%p\n",&var);
printf("%p\n",&p);
printf("-------\n");
var=11;
printf("%d\n",var);
printf("%d\n",p);
printf("%p\n",&var);
printf("%p\n",&p);
return 0;
}
可以看到var的值变了,p的值没变 而且两个变量的内存地址也不变,也就是说这只是一个简单的改变值得过程,如果你要想变量p根据var值变化而变化,那p就要指向var的内存地址
如下,看下下面的的代码理解下
#include <stdio.h>
#include <windows.h>
int main(){
SetConsoleOutputCP(65001);
int var=20;
int *p;
p=&var;
printf("%d\n",var);
printf("%d\n",*p);
printf("%p\n",&var);
printf("%p\n",p);
printf("-------\n");
var=11;
printf("%d\n",var);
printf("%d\n",*p);
printf("%p\n",&var);
printf("%p\n",p);
return 0;
}
var 是( 值 | 地址 ) 就是 ( 20 | &var)
*p是指针变量,指向 var的地址,相对于var 以p来表达就是( *p | p)就是( 值 | 地址 )
指针算数运算
#include <stdio.h>
#include <windows.h>
int main(){
SetConsoleOutputCP(65001);
int var[]={10,100,200};
int *ptr;
ptr=&var[0];// 也可以是ptr=var
for(int i=0;i<3;i++){
printf("var[%d]值:%d\n",i,*ptr);
printf("var[%d]地址:%p\n",i,ptr);
ptr++;
}
return 0;
}
指针数组
#include <stdio.h>
#include <windows.h>
#define MAX 3
int main(){
SetConsoleOutputCP(65001);
int var[MAX]={10,100,200};
int *ptr[MAX];
for(int i=MAX-1;i>=0;i--){
ptr[i]=&var[i];
printf("%d\n",*ptr[i]);
}
return 0;
}
字符串数组指针
#include <stdio.h>
#include <windows.h>
#define MAX 3
int main(){
SetConsoleOutputCP(65001);
char *name[]={
"小白",
"小红",
"小明"
};
for(int i=MAX-1;i>=0;i--){
// printf("%s\n",name[i]);
puts(name[i]);
}
}
指向指针的指针
#include <stdio.h>
#include <windows.h>
#define MAX 3
int main(){
SetConsoleOutputCP(65001);
int a=1;
int *b,**c;
b=&a;
c=&b;
printf("%d\n",a);
printf("%d\n",*b);
printf("%d\n",**c);
printf("%p\n",&a);
printf("%p\n",b);
printf("%p\n",c);
}
传递指针给函数
指针作为参数的函数
#include <stdio.h>
#include <windows.h>
void countFun(int *s){
*s=1;
}
int main(){
SetConsoleOutputCP(65001);
int size=0;
countFun(&size);
printf("%d",size);
}
指针作为参数的函数,也能接受数组作为参数
#include <stdio.h>
#include <windows.h>
double avg(int *arr,int size){
int count=0;
for(int i=0;i<size;i++){
count+=arr[i];
};
double avgVal=(double)count/size;
return avgVal;
}
int main(){
SetConsoleOutputCP(65001);
int arr[]={1,2,3,4,5,6};
int size=sizeof(arr)/sizeof(arr[0]);
double avgVal=avg(arr,size);
printf("%d",avgVal);
}
函数返回指针
函数内要return 必须 用statci定义静态变量C/C++ 中 static 的用法全局变量与局部变量 | 菜鸟教程
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
/* 要生成和返回随机数的函数 */
int * getRandom( )
{
static int r[10];
srand((unsigned) time(NULL));
for(int i=0;i<10;i++){
r[i]=rand()%10;
printf("%d\n",r[i]);
}
return r;
}
/* 要调用上面定义函数的主函数 */
int main ()
{
int *p;
p=getRandom();
printf("\n-------\n");
for(int i=0;i<10;i++){
printf("%d\n",*(p+i));
}
return 0;
}
函数指针
例如下面是正常的函数文章来源:https://www.toymoban.com/news/detail-411481.html
#include <windows.h>
#include <stdio.h>
int cyc1(int x,int y){
return x>y?x:y;
}
int main(void){
SetConsoleOutputCP(65001);
int a,b,c;
printf("请输入3个整数:");
scanf("%d %d %d",&a,&b,&c);
int val=cyc1(cyc1(a,b),c);
printf("%d",val);
return 0;
}
然后用函数指针文章来源地址https://www.toymoban.com/news/detail-411481.html
#include <windows.h>
#include <stdio.h>
int cyc1(int x,int y){
return x>y?x:y;
}
int main(void){
SetConsoleOutputCP(65001);
int a,b,c;
int (*p)(int,int)=&cyc1;
printf("请输入3个整数:");
scanf("%d %d %d",&a,&b,&c);
int val=p(p(a,b),c);
printf("%d",val);
return 0;
}
到了这里,关于c语言指针理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!