指针是一个值为地址的变量,即存储地址的变量,地址没有数据类型之说,char *,int *都是一样的长度,跟机器有关。
int *a表示a地址处存储的值为整型。
指针的初始化
int a = 10; int *b = &a;
或者
1 int a = 10; 2 int *b; 3 b = &a;
指针的解引用
通过*b,可以对指针b进行解引用(间接访问)从而访问得到a的值。在指针解引用之前需要对它进行检查,判断b是否为NULL
指针常量和常量指针
int *p表示指向整型的指针,也叫整型指针,int const *p和int * const p两个变量则不同,根据const和*的顺序,int const *p中表示常量指针,int * const p表示指针常量,其中常量指针也可写作const int *p。
常量指针(与整型指针类比),表示指针指向的值是常量,不可修改。指针常量,表示指针是常量,地址不可修改。
1 int a,b; 2 3 int * const p = &a; //指针常量 4 *p = 9; //操作成功 5 p = &b; //操作错误 6 7 int const * m = &a; //常量指针 8 *m = 9; //操作错误 9 m = &b; //操作成功
指向常量的指针常量该怎么写?
1 const int * const b = &a;//指向常量的指针常量
数组
1.一维数组
int b[10],其中数组名b的值表示一个指针常量,是整个数组的地址,也是第一个元素的地址,该地址不可修改,但所指向的值可以修改。
当数组名在表达式中使用时,编译器为它产生一个指针常量,除了两种情况数组名不用指针常量来表示:sizeof和&。sizeof返回整个数组的长度(以字节为单位),而不是指向数组的指针的长度。&取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向指针常量的指针。
1 int a[10]; 2 int *c; 3 4 c = &a[0]; //第一个元素的地址 5 c = a; //数组的地址 6 7 a = c; //错误,数组名是常量指针,该值不可修改 8 *a = 1;//指向的值可以修改
2.一维数组下标访问和指针间接访问
声明一个数组a,a和&a[0]表示同一个地址,对数组中的值进行访问时,*a和a[0]都表示第一个元素,*(a+n)和a[n]同。
1 int a[10] = {0,1,2,3,4,5,6,7,8,9}; 2 3 int *b = a+1; //b指向a[1] 4 //int *b = &a[1]; 5 6 //从b的角度访问 7 printf("%d", *b++); 8 printf("%d", b[0]); 9 printf("%d", b[-1]); 10 11 12 //从a的角度访问 13 printf("%d", a[n]); 14 printf("%d", *(a+n));
上述代码中3、4两条语句表示的意思相同,表示b指向a[1]。C的下标引用和间接访问表达式是一样的
3.二维数组
4.一维数组下标访问和指针间接访问
指针和数组
指针和数组不是相等的,数组具有确定数量的元素,指针只是一个标量值,
指向指针的指针和指向数组的指针