int *p[n]
和 int (*p)[n]
区别
int *p[n]
[]
优先级高于*
int *p[n]
就是一个 指针数组 数据类型为int *
,元素为地址
int (*p)[n]
是一个 二维数组
是一个 指针数组 的 数组
二维数组 和 一维数组
两者是相似的
都是 二维数组
一维数组 只是是特殊的而已
只需让 二维数组 其中一维等于 零
就像二维坐标中的一轴为零
用 int (*p)[n]
表示 一维数组
不提倡这样用
没有必要
这里只是为了更清晰的表达二维数组
#include "stdio.h"
#define LINE_NUM 2 /*行数*/
#define LIST_NUM 3 /*列数*/
#if 1
//====================一维数组=============================//
//===================特殊的二维数组========================//
int main()
{
//定义 拥有一个维度 其中包含 3 个整形元素的数组
int c[LIST_NUM+1]={1,2,3};// +1 防止数组溢出
/**
* () 优先级最高
* 就近原则 : p_c 是一个指针
*
* 等价 互相 赋值
* (*p_c)[LIST_NUM+1]
* c[LIST_NUM+1]
* *p_c == c == &c 元素的地址
*
* 数组: c 或是地址或是数组
* 指针: *p_c 必然是地址
* *p_c --- 指针数组的元素-指针
* p_c --- 一个 指针数组的数组 的地址(首元素指针)
*/
int (*p_c)[LIST_NUM] = c;//
//数组访问
int i = 0;
for(i=0; i<LIST_NUM; i++)
{
/**
* 式子 解释
* *((*p_c)+i) * 运算 -- 取实际值
* (*p_c)+i 指针数组的元素-的-地址-的-偏移-下一个元素的地址
* *p_c 指针数组的元素-的-地址-(是指针)
* p_c 一个指针数组的首地址
* p_c+1 二重身了---二维数组了---多个指针数组
* 下方二维数组就靠他了
*/
printf("*((*p_c)+i) : %d\n",*((*p_c)+i));//
printf(" (*p_c)+i : %d\n",(*p_c)+i);//
printf(" *p_c : %d\n",*p_c);//
printf(" p_c : %d\n",p_c);//
printf(" p_c+1 : %d\n",p_c+1);//
printf("sizeof(*p_c) : %d\n",sizeof(*p_c));//
printf("sizeof(p_c) : %d\n\n",sizeof(p_c));//
}
return 0;
}
#endif
/*======================运行结果==========================*/
PS V:\file\code\c\data_structure> .\ll.exe
*((*p_c)+i) : 1
(*p_c)+i : 6422016
*p_c : 6422016
p_c : 6422016
p_c+1 : 6422028
sizeof(*p_c) : 12
sizeof(p_c) : 8
*((*p_c)+i) : 2
(*p_c)+i : 6422020
*p_c : 6422016
p_c : 6422016
p_c+1 : 6422028
sizeof(*p_c) : 12
sizeof(p_c) : 8
*((*p_c)+i) : 3
(*p_c)+i : 6422024
*p_c : 6422016
p_c : 6422016
p_c+1 : 6422028
sizeof(*p_c) : 12
sizeof(p_c) : 8
/*======================运行结果==========================*/
用 int (*p)[n]
表示 二维数组
#include "stdio.h"
#define LINE_NUM 2 /*行数*/
#define LIST_NUM 3 /*列数*/
#if 1
//====================二维数组=============================//
//=================一维数组的小变形========================//
int main()
{
int a[LINE_NUM][LIST_NUM] = {{5, 2, 3}, {4, 5, 6}};
int (*p_a)[LIST_NUM] = a;//
/**
* 变式为
* int (*p_a)[LIST_NUM];
* p_a = a;
*/
int h = 0;//行
int l = 0;//列
for(h=0; h<LINE_NUM; h++)
{
for(l=0; l<LIST_NUM; l++)
{
printf("%d ",*(*(p_a+h)+l));//
}
printf("\n");
}
return 0;
}
#endif
/*======================运行结果==========================*/
PS V:\file\code\c\data_structure> gcc .\digit_group.c -o ll
PS V:\file\code\c\data_structure> .\ll.exe
5 2 3
4 5 6
PS V:\file\code\c\data_structure>
/*======================运行结果==========================*/