指针
1)指针就是个变量,用来存放地址,地址唯一标识一块内存空间;
2)指针的大小是固定的4(8)个字节(32(64)位平台);
3)指针是有类型的,指针的类型决定了指针的+/-整数的步长,指针解引用操作时的权限;
int main()
{
int a = 1;
int* pa = &a;
*pa = 2;
printf("%p\n",&a); // 0116F794
printf("%p\n",pa); //0116F794
printf("%d\n",a); //2
return 0;
}
二级指针
由于指针变量也是变量,是变量就有地址,那么一级指针变量的地址就是二级指针。
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;
**ppa = 30;//等价于 *pa=30;/ a=30;
printf("%d\n",a); //30
*pa = 20;
printf("%d\n",a); //20
return 0;
}
指针数组与数组指针
1)指针数组: int * p1[10]
由于[]的优先级高于*,所以p1先于[10]结合成为数组,数组的元素类型为int* ;
指针数组是数组, 数组的每个元素都是指针;
2)数组指针: int (* p2)[10]
由于()的优先级高于[],所以p先和*结合,说明p是一个指针变量,指向一个大小为10的整型数组 ;
指针数组是指针, 能够指向一个数组;
int main()
{
int a[5] = {1,2,3,4,5};
//pa1为指针数组,数组的每个元素为a数组元素的地址
int* pa1[5] = {&a[0],&a[1],&a[2],&a[3],&a[4]};
//pa2为数组指针,指针指向数组a
int (*pa2)[5] = &a;
return 0;
}