(第四篇)
目录
4.指针和数组
4.1数组名的理解
4.2指针访问数组
4.3再谈字符指针
4.4理解练习
4.5一维数组传参和指针
4.指针和数组
4.1数组名的理解



(a)例如以下sizeof中,数组名就是指的是整个数组;

再如以下代码演示:

(b)不难发现,使用printf打印数组的地址的时候,&+数组名[0]得到的首元素地址与直接使用arr得到的地址相同;
(c)但是同时也有差异:

4.2指针访问数组

(a)以前是让一个指针指向指定数组元素的地址,再通过解引用使用;

(b)与前面相同,指针传入数组名即为首元素地址,通过指针移动的方式访问数组各个元素;



(c)还有一种特殊的写法:
C 标准中规定:
E1[E2] 完全等价于: *((E1) + (E2))
所以: i[arr] 会被编译器理解为:*(i + arr)
也就是说,i[arr] 的定义本身就是 *(i + arr)。
另一方面,常见的写法:arr[i] 等价于: *(arr + i)
而 C 语言允许“指针 + 整数”和“整数 + 指针”两种写法,并且它们计算出的地址相同。若 arr 是指向某类型元素的指针,i 是整数,那么:
arr + i i + arr
都表示同一个地址:从 arr 开始向后移动 i 个元素。数组名 arr 在表达式中通常也会退化为指向首元素的指针。
所以:i[arr] == *(i + arr) == *(arr + i) == arr[i]
总结:i[arr] 等价于 *(i + arr),是因为 C 语言把 x[y] 直接定义为 *(x + y);而 i + arr 和 arr + i 在指针算术中产生相同地址。实际编程中应写 arr[i],可读性更好。
4.3再谈字符指针



例如以下代码:

(a)加const修饰是用于如果不小心修改,会直接报错;
(b)类似于数组,调用时用指针pstr指向字符串的首字符,后面加上[1]后表示从首字符地址向后移动多少位;

示范代码如下:

再看下面示例:

(a)这里可以看出使用指针指向字符串和直接创建字符串的区别:
(1)直接创建的话就算内容一样,由于创建字符串相当于再内存开辟空间,直接调用数组名指向首元素地址,由于开辟空间不同,地址也不同;
(2)指针指向相同内容时指向相同地址,所以相同;
4.4理解练习

(a)图中能够辅助理解有关数组名的真实含义,图中有解释就不过多赘述;
(b)再看以下代码:

(c)第一个是首元素地址+1,指向向后一个元素;第二个数组地址+1后跳过整个数组,然后强制类型转化为int型,最后-1往前跳一个元素(即一个int的位置);
4.5一维数组传参和指针



网硕互联帮助中心





评论前必须登录!
注册