本期笔记内容:
C语言 :28.指针于数组
通过27.指针运算的笔记我们已经知道:
指针类型加n,首地址向后移动 n*步长 个字节
指针类型减n,首地址向前移动 n*步长 个字节
#include<stdio.h>
int main()
{
int* p = (int*)100;//将100强制转换为int的指针类型,100为地址
p + 1;//结果为96
p - 1;//结果为104
}
数组元素在内存中是连续的,那么数组第一个元素的首地址就是整个数组的首地址
可以使用取地址运算符&获取第一个元素的地址和空间大小
那我们如何用指针来访问数组呢?
一、第一个元素获取数组首地址
看下面这个代码
int main()
{
int arr[5] = { 111,222,333,444,555 };//定义了一个数组
printf("%d\n",arr[0]);//在此要注意,数组中的[0]是第一个元素,以此类推
printf("%d\n",arr[1]);
printf("%d\n",arr[2]);
printf("%d\n",arr[3]);
printf("%d\n", arr[4]);//打印出了这个数组的每一项
int* p = &arr[0];//指针p指向了数组的第一个元素首地址
p;//指向数组的第一个元素
p + 1;//指向数组的第二个元素
p + 2;//指向数组的第三个元素
p + 3;//指向数组的第四个元素
p + 4;//指向数组得第五个元素
}
可以看出在指针上加1可以移动一个元素
我们可以通过取值运算符*使用指针 访问 或 修改 目标数据对象
#include<stdio.h>
int main()
{
int arr[5] = { 111,222,333,444,555 };
int* p = &arr[0];
printf("%d\n", *p);//打印了数组第一个元素111
printf("%d\n", *(p + 1));//打印了数组第二个元素222
printf("%d\n", *(p + 2));//以此类推
printf("%d\n", *(p + 3));
printf("%d\n", *(p + 4));
return 0;
}
二、数组名获取数组首地址
除了通过第一个数组得到首地址,还有可以 直接通过数组名获取首地址
#include<stdio.h>
int main()
{
int arr[5] = { 111,222,333,444,555 };//这里定义了一个数组
printf("arr=%u\n", arr);//这里打印了数组名
printf("&arr[0]=%u", &arr[0]);//这里打印了数组第一个元素得地址
}
可以观察到打印得到得两个结果相同
因此可以得出结论:arr的值是 首地址
我们对数组名进行讨论
由上面的代码可以猜测arr与&arr[0]的数据类型是否一样?
验证:
如果数组名是一个指针,那么在32位程序中占用4个字节,在64位程序中占用8个字节
示例中使用32位进行编译
#include<stdio.h>
int main()
{
int arr[5] = { 111,222,333,444,555 };
int* p = arr;//数组类型 转换为 指针类型 然后进行赋值运算
printf("sizeof arr=%d\n", sizeof(arr));//打印出位20
printf("sizeof p=%d\n", sizeof(p));//打印出为4
printf("sizeof arr+1=%d\n", sizeof(arr + 1));//打印出为4
return 0;
}
观察结果
已知数组中有5个元素
sizeof(arr)的打印出20,所以arr不是指针类型
sizeof(p)打印出了4可以看出数组arr给指针成功赋值
sizeof(arr+1)打印出4是由于arr+1等于&arr[0]+1
得出结论:当数组名出现在 表达式 中,数组名将会 转换 为指向数组第一个元素的指针
注意:例外:①对数组名使用sizeof时,由 sizeof(arr) 可以看出
②对数组名使用取地址运算符&时
三、指针访问数组
要访问数组的元素有两种方法:①数组名[下标]
②*(数组名+偏移量)//此处的偏移量是指 指针 指向地址与首地址 相差几个元素
[]被称作下标运算符 优先级高于一切运算符
表达式通常为:A[k] 最终会将其转化为*(A+k)
也就是说编译器会将这种下标的表达式转换为指针类型的表达式进行运算
例子:
例子:
#include<stdio.h>
int main()
{
int arr[5] = { 111,222,333,444,555 };
printf("arr[2]=%d\n", arr[2]);
printf("2[arr]=%d\n", 2[arr]);
printf("*(arr+3)=%d\n", *(arr + 2));
return 0;
}
//打印出来的结果都是333