我们初学时经常把指针当成地址用,其实指针和地址是有差别的。
指针是一个变量,存放的是地址。很好理解,但是当指针存放字符串地址时,就麻烦多了。
假设有一个字符串
char a[22]="4544adas44456";
char *p = a;
printf("%p\n",p); //0x7ffdf03a6010
printf("%p\n",*p); //0x34
printf("%p\n",p[0]); //0x34
printf("%p\n",a); //0x7ffdf03a6010 //a+1 --> a + 1
printf("%p\n",&a); //0x7ffdf03a6010 //&a+1 --> a + sizeof(a)
printf("%p\n",&a[0]); //0x7ffdf03a6010 //
指针、字符串的变量名、首地址、第一个字符的地址 是相同的位置。
但是
char a[22]="4544adas44456";
char *p = a;
char *q = malloc(100);
printf("%d\n",sizeof(q)); //8
printf("%d\n",sizeof(p)); //8
printf("%d\n",sizeof(*p)); //1
printf("%d\n",sizeof(a)); //22
printf("%d\n",strlen(a)); //13 不算'\0'
printf("%d\n",sizeof(&a)); //8
printf("%d\n",sizeof(&a[0])); //8
虽然上面验证了,指针和字符串首地址相同,但是测量字符长度时,首地址能正确测量字符串长度,指针就是它本是的字节数。
但是在函数中
void fun(char q[])
{
printf("%d\n",sizeof(q)); //8
}
不管参数是数组还是指针,字节数都是8(64位),是个地址。
输出数据时
char *a="4544adas44456";
char *p = a;
printf("%c\n",p); //@
printf("%c\n",*p); //4
printf("%c\n",p[0]); //4
printf("%c\n",a); //@
printf("%c\n",&a); //?
printf("%c\n",&a[0]); //@
&a相当于取指针的地址,而不是字符串的地址
char a[22]="4544adas44456";
char *p = a;
printf("%c\n",p); //?
printf("%c\n",*p); //4
printf("%c\n",p[0]); //4
printf("%c\n",a); //?
printf("%c\n",&a); //?
printf("%c\n",&a[0]); //?
当用字符串定义时,&a还是a的地址
char a[] = "477"; a = "668"; //错误,字符串不能直接赋值 *a = "6"; // 警告 *a = '6'; char *p ="477"; p = "668"; //可以重新给指针分配地址 *p = '6'; //段错误。指针指向常量区,不能改变。
指针和数组
int a[] = {1,2,3,4,5,6};
int *p =a;
printf("%d %d %d %d\n",a[2],p[2],p[0],p); //3 3 1 -1046649312
p[2] = *(p+2)
在二维数组中
还没探索!!!
本文探讨了C语言中指针和地址的概念差异,指出指针是一个存放地址的变量,尤其在处理字符串时需要注意其特殊性。在函数参数传递中,数组和指针虽然表现相似,但本质不同。通过示例展示了指针运算和数组操作的差异,并预告了对二维数组的进一步探索。

2616

被折叠的 条评论
为什么被折叠?



