指针和数组的关系

指针是一个值为地址的变量,即存储地址的变量,地址没有数据类型之说,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.一维数组下标访问和指针间接访问

指针和数组

指针和数组不是相等的,数组具有确定数量的元素,指针只是一个标量值,

指向指针的指针和指向数组的指针

猜你喜欢

转载自www.cnblogs.com/qinguoyi/p/10112122.html
今日推荐