什么是指针:
指针也是一种变量,不过他是专门用来存放某一块内存的有且只有一个的地址的,即类似于门牌号的一串数字。
在32位/64位平台下指针的大小是固定的4/8个字节。
指针也有类型,其类型决定了指针的+-整数的长度是多少字节,还决定了指针解引用时操作的权限。
一级指针:
int main(){
int a = 10;
int* p = &a;
return 0;
}
这里的int*类型的变量p就是一个一级指针,其解引用内容为p所存地址下的那一块内存的内容。
二级指针:
int main(){
int a = 10;
int* p = &a;
int** q = &p;
**q = 20;
printf("%d\n",a);
return 0;
}
这里的int** 类型的变量q就是一个二级指针,他所存内容是一级指针p在内存中的地址,因为是变量就会在内存中开辟一段空间,所以p是拥有地址的,二级指针解引用需要用两个**,这样就可以访问到一级指针所存地址下的内容了。
指针和数组:
其实这两者本没有联系,只是在C语言中看似稍微有那么点联系。
定义一个数组得有一个数组名,这是肯定的,而数组名在使用的时候可以隐式转换成一个指针,他保存了数组首元素的地址,而如果取数组名的地址那又表示什么呢,比如:
int main(){
int arr[] = {1,2,3,4};
printf("%d\n",arr);
printf("%d\n", &arr);
printf("%d\n", arr+1);
printf("%d\n", &arr+1);
return 0;
}
这里的输出结果为:
10157816
10157816
10157820
10157832
解释一下:arr表示该数组首元素的地址,而&arr表示一个数组指针,也就是一个指向整个数组的指针,用其首元素所在地址表示,当进行+1操作时,arr+1表示该数组名隐式转换成的指针向后移动int个长度,即一个元素的大小,指向该数组的第二个元素,&arr+1表示该指针数组,也是一个指针,不过他向后移动了该数组的整个的长度。,即16个字节。
指针数组:
首先他是一个数组,而这个数组里存放的是指针类型的元素。
int *arr[10] []的优先级最高,先与arr结合,则arr是一个数组,而int*是数组里元素的类型。
eg:char* arr[2]={"hello","world"}; arr是一个数组,他的每个元素都是该字符串的首字母在内存上的那一块的地址。
数组指针:
首先他是一个指针,这个指针指向一个数组。
int(*p)[10] ()的优先级最高,所以p是一个指针类型,而该指针指向一个拥有十个元素,每个元素都是int类型的数组。