指针数组、数组指针与多维数组
一、指针数组
指针数组就是 “一个数组,数组的元素都是指针”。
int *a[5];
含义:
| 元素 | 类型 |
|---|---|
| a | 数组名 |
| a[i] | int* 指针 |
| sizeof(a) = 5 * sizeof(int*) = 5 × 8 = 40 字节(64bit) |
再例如字符指针数组:
char *strs[5] = {"hello","world","how","are","you"};
这是一种非常常用的字符串数组结构:
- 每个
strs[i]指向一个字符串常量 - 排序时交换的是 指针地址,而不是修改字符串内容
示例:使用指针数组对字符串排序
char *tmp=NULL;
for(j=len-1;j>0;j--)
for(i=0;i<j;i++)
if(strcmp(strs[i],strs[i+1])>0)
{
tmp=strs[i];
strs[i]=strs[i+1];
strs[i+1]=tmp;
}
交换指针非常快,效率最高。
二、二维字符数组(真正存储字符串内容)
char strs[5][100] = {"hello","world","how","are","you"};
每行有 100 字节空间,可以修改字符。
strs[i]是一个 char[100] 数组- 交换时不能交换指针,必须
strcpy
示例:
strcpy(tmp, strs[i]);
strcpy(strs[i], strs[i+1]);
strcpy(strs[i+1], tmp);
三、指针数组 + 二维字符数组混合使用
char str[5][100] = {0};
char *pstr[5] = {str[0], str[1], str[2], str[3], str[4]};
这样做的意义:
str[][]真正存储数据pstr[]用来排序、传参,更灵活
输出函数:
int show_array(char **pstr, int len)
{
for(int i=0;i<len;i++)
printf("i:%d %s\n", i+1, pstr[i]);
}
四、命令行参数
int main(int argc, char **argv)
示例程序把两个命令行数字相加:
int result = atoi(argv[1]) + atoi(argv[2]);
运行:
./a.out 555 666
result is 1221
五、一维数组与数组指针的地址
int a[5]={1,2,3,4,5};
&a 类型:int (*)[5] —— 指向整个数组
a 类型:int* —— 指向 a[0]
a+1 指向 a[1]
&a+1 跨越整个数组大小(20 字节)
示例输出展示地址变化:
a → a[0] 的地址
a+1 → a[1] 的地址
&a → 数组本体地址
&a+1 → 数组本体下一个数组位置
六、数组指针
定义:
int (*p)[5] = &a;
含义:
p指向一个 由 5 个 int 组成的数组*p就是该数组(*p)[1]是第二个元素
示例:
printf("%d\n", **p); // a[0]
printf("%d\n", *(*p + 1)); // a[1]
printf("%d\n", p[0][1]); // a[1]
七、二维数组传参:必须使用“数组指针”
二维数组:
int a[2][3] = {1,2,3,4,5,6};
传参时必须写:
int show_array(int (*p)[3], int row)
因为:
a退化为int (*)[3]- 每行有 3 个 int
示例访问:
printf("p[1][1] = %d\n", p[1][1]);
1083

被折叠的 条评论
为什么被折叠?



