课程名称: 物联网/嵌入式工程师
课程章节: 第二周 计算机基础和C语言
主讲老师: 大白老师
课程内容:
今天主要学习了数组指针,指针数组和数组指针的区别
课程收获:
首先说数组指针之前得明白:
&数组名与数组名
&数组名表示的是取出整个数组的地址,而不是首元素地址,所以它+1跳过整个数组
数组名在sizeof单独使用时或者被&数组名时表示的是整个数组。
具体的数组指针定义:
指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。
定义就如上述,经常为:
char (*pa)[4];
如果指针数组和数组指针这俩个变量名称一样就会是这样:char *pa[4]和char (*pa)[4],指针数组和数组指针的形成的根本原因就是运算符的优先级问题,所以定义变量是一定要注意这个问题。
pa是一个指针指向一个char [4]的数组,每个数组元素是一个char类型的变量,所以可以写成:char[4] (*pa)
数组指针每次移动的是一个数组的大小
p ++;// p移动了4个元素
转换
数组类型指针---加*---->普通类型指针
int (*p)[3];
p的类型int ()[3]-----------加 * ---------->*p的类型是int *
加深一下理解
#include <stdio.h>
int main()
{
int temp[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &temp;//注意这里p指针被赋值&temp,意思就是p数组指针指向了整个数组的首地址
int i;
for(i = 0; i < 5; i++)
{
printf("%d\n", *(*p + i));
//或者 printf("%d\n", (*p)[i]);
}
return 0;
}
上述printf语句的*p先访问了首地址,通过数组首地址遍历得到结果。
数组指针,指向的是数组所在的内存空间
作业:
答案:
int main() {
int a[2][3] = {10, 20, 30, 40, 50, 60};
int (*p)[3] = a;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("a[%d][%d] = %d\n", i, j, a[i][j]);
printf("*(a[%d] + %d) = %d\n", i, j, *(a[i] + j));
printf("*(*(a + %d) + %d) = %d\n ", i, j, *(*(a + i) + j));
printf("===================\n");
printf("p[%d][%d] = %d\n", i, j, p[i][j]);
printf("*(p[%d] + %d) = %d\n ", i, j, *(p[i] + j));
printf("*(*(p + %d) + %d) = %d\n", i, j, *(*(p + i) + j));
printf("===================\n");
}
}
return 0;
}
每日一句:
大胆迈向未来吧,我们仍在旅途之中