学了这么久的C语言,每次遇到指针都会晕头转向。。。。。。。。。。今天就先总结一些自己对指针的认识。由于这是自己的理解,有可能出现偏差,希望如果有错的地方希望大神可以帮忙指正。
1、首先指针是一个变量,其存储的是数据在内存中的地址,而不是数据本身的值,这点要切记(存储的是地址)
2、由于指针存储的是一个地址,利用sizeof()时,其实际上代指的是指针本身的值,即这个地址所占得字节数,而这个值与操作系统有关,32位操作系统为4字节,64位操作系统位8字节。
以32位操作系统为例,定义Type *p; sizeof(p) = 4;不管Type是 char,int, long, struct, int **…
3、当在处理指针的算术运算时,一定要注意到底是指针所指向地址存储的数据的值*p的变化,还是指针所指向地址p的变化。
4、数组名也是一个地址,其可以理解为是一个常指针,只不过其只能指向本数组首元素的地址。
以32位操作系统为例,
int main()
{
int arr[5] = {1,3,7,9,6};
char array[] = {"hello!"};
int *p = arr;
char *p2 = array;
printf("%d\n",*p); //输出为1
printf("%d\n",p); //输出地址为2686728(打印地址因为%p,这里为了统一所以用了十进制)
printf("%d\n",*p+2); //输出值为3(*p为存储的数据的值即为1,然后+2)
printf("%d\n",*(p+2)); //输出值为7(先是指针p向后移动2个字节,即现在指向a[2],其值为7)
printf("%d\n",sizeof(*p)); //输出值为4(代表arr[0],其为int型)
printf("%d\n",sizeof(p)); //输出值为4 (为指针,代表一个地址,,与cpu位数相同)
printf("%d\n",sizeof(arr)); //输出值为20(代表整个数组,故是5*4个字节)
printf("%d\n",sizeof(*arr)); //输出值为4(代表arr[0],其为int型)
printf("%d\n",sizeof(array)); //输出值为7(sizeof会带字符串中的’\0’字符)
printf("%d\n",sizeof(*array)); //输出值为1 (代表array[0],其为char型)
printf("%d\n",sizeof(p2)); //输出值为4(为指针,代表一个地址,,与cpu位数相同,虽然该
//指针是char*类型)
printf("%d\n",sizeof(*p2)); //输出值为1(代表array[0],其为char型)
return 0;
}