目录
知识点5【任何维度的数组 在物理存储上 都是一维的】(了解)
知识点1【指针数组】
指针数组:本质是数组 只是数组的每个元素 是指针。
案例:
void test01()
{
int num1 = 10;
int num2 = 20;
int num3 = 30;
//指针数组
int *arr[3]={&num1, &num2, &num3};
char *arr2[3];
//arr[0] = &num1, arr[1]=&num2, arr[2]=&num3
printf("%d\n", *arr[1]);//*arr[1]=*&num2=num2
printf("%d\n",sizeof(arr));//12
printf("%d\n",sizeof(arr2));//12
return;
}
案例:
void test02()
{
char *arr[3]={"hehehe","hahaha","heiheihei"};
printf("%d\n", sizeof(arr));//12
printf("%s\n", arr[1]);
printf("%c\n", *(arr[1]+1));
}
运行结果:
知识点2【数组指针】
数组指针:本质是指针变量 只是保存的是 数组的首地址
案例:
void test03()
{
int arr[5]={10,20,30,40};
int (*p)[5];//数组指针:本质是一个指针变量 只是该变量 保存的是数组的首地址
printf("%d\n",sizeof(p));//4
printf("p=%u\n", p);
printf("p+1=%u\n", p+1);
p = &arr;//&arr 才代表数组的首地址
printf("%d\n", *(*p+3));//40
//*(*p+3) == *(*(p+0)+3)==*(p[0]+3)==p[0][3]
printf("%d\n", p[0][3]);//40
}
运行结果:
总结:
指针数组:本质是数组 只是数组的每个元素是指针
数组指针:本质是指针变量 只是保存的是 数组的首地址
知识点3【二维数组的分析】
案例:int arr[3][4];
*arr+2 : 第0行 第2列的列地址
arr[1]: *(arr+1) 第1行第0列的列地址
&arr[0]+2: &*(arr+0)+2==arr+2 表示的是第2行的行地址
**arr: **arr == *(*(arr+0)+0)==arr[0][0]
知识点4【数组指针 与 二维数组的关系】(了解)
void test04()
{
int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int i=0,j=0;
//数组指针 本质是指针变量
int (*p)[4] =arr;
printf("%d\n",sizeof(p));
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
//printf("%d ", *(*(p+i)+j));
printf("%d ", p[i][j]);
}
printf("\n");
}
}
运行结果:
知识点5【任何维度的数组 在物理存储上 都是一维的】(了解)
void test05()
{
int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int i=0;
int *p = &arr[0][0];
for(i=0;i<3*4; i++)
{
//printf("%d ", *(p+i));
printf("%d ", p[i]);
}
printf("\n");
}
运行结果: