作为C语言萌新刚刚学习了指针但是对指针理解不透彻不会使用指针不知道在什么场景下使用,查了查资料在这里做一下总结。
一、type *p //指向type类型的指针
使用指针对变量的操作
#includeint main() { int a=2021; int *p; p = &a; printf("%dn",a); printf("%dn",*p); (*p)++; //加上括号,不然就先输出*p然后p++. printf("%dn",a); printf("%d",*p); return 0; }
指针对一维数组赋值与打印输出:
int a[5],*p=a,i;
for(i=0;i<5;i++)
scanf("%d",p+i);
for(i=0;i<5;i++)
printf("%2d",*(p+i));
使用指针对一维字符数组的操作
#includeint main() { char a[20],*p=a; //指针的声明与初始化 int i; gets(p); printf("输出:n%sn",p);//以字符串形式输出 for(i=0;i<20;i++) //字符形式循环输出 printf("%c",*(p+i)); return 0; }
二、type *p[] //指向type类型的一维指针数组(存放着type类型的数据组成的一维数组/也可以存放二维数组的每行首地址)
使用指针数组可以减少内存空间的浪费
char *p[]={"I","love","you"};
当然也可以先声明指针在赋值;
char *p[3]; p[0] = "I"; p[1] = "love"; p[2] = "you";
还可以获取二维字符数组首地址再进行操作,虽然有空间的浪费,但是灵活;
int i;
char a[3][20] = {"I","love","you"},*p[3];
for(i=0;i<3;i++)
p[i]=a[i];
for(i=0;i<3;i++)
printf("%s n",p[i]);
结果是:
三、type (*p)[] //指向一维数组的指针,有的也叫做行指针【注意声明行指针时记得对 [ ] 赋值及加上二维数列数 】我是这么理解的:首先p与*结合表示p指向一个地址,*p [ i ]表示这个地址的值,这个一维数组有i个值。现在有一个问题,我们如何操作一维数组与二维数组呢?
一维数组赋值与打印输出
int a[4],(*p)[4]=a; //谭浩强老师的书上是&a但是我在电脑上得到的结果是相同的,这一点不懂
int i;
for(i=0;i<4;i++)
scanf("%d",&(*p)[i]);
for(i=0;i<4;i++)
printf("%d",*(*p+i));
赋值打印输出二维数组:(*(p+i)+j) 这个整体表示二维数组的地址指定数组大小的作用来了,当p+i表示为p+i*4 所以(*(p+i)+i)就是*(p+i*4+j).
int a[3][4],(*p)[4]=a,i,j; //对指针声明以及初始化
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",*(p+i)+j); //表示*(p+i*4+j)==&p[i][j]
for(i=0;i<3;i++)
for(j=0;j<4;j++)
printf("%d",*(*(p+i)+j)); //表示*(*(p+i*4+j))==p[i][j]
对二维字符串赋值打印:
char a[3][5],(*p)[5]=a;
int i;
for(i=0;i<3;i++)
gets(*(p+i)); //p+i实际上是p偏移了i*5个字节,到了下一行的首地址
for(i=0;i<3;i++)
printf("%sn",*(p+i));
四、type **p 将他们分开就好理解了type * 与 *p 表示p的数据类型为type * 则p指向一个地址,*p表示这个地址的值**p才表示这个地址上存放的type类型的值,与type *p和好区分的。



