15、指针数组、数组指针与多维数组

编程达人挑战赛·第4期 10w+人浏览 240人参与

指针数组、数组指针与多维数组

一、指针数组

指针数组就是 “一个数组,数组的元素都是指针”

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]);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值