c语言字符二维数组指针赋值,C语言之二维数组与指针

二维数组:

char a[2][3];

二维数组实质上也就是一维数组,a[2][3]可看做一个2个元素的一维数组,这2个元素又是另一个数组,在内存中,它的排布如下:

f4bae42f309ec6571ab571c0058aad11.png

#include "stdio.h"

int main(int argc, char *argv[])

{char a[2][3]={{1,3,9},{2,4,8}};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]);

}for(int i=0; i<2;i++)for(int j=0;j <3;j++)

{

printf("a[%d][%d] Addr=0X%X\n", i, j, (int)&a[i][j]);

}return 0;

}

da73d8614a9aede82e835e13421f9bd6.png

数组指针:

char a[2][3]={{1,3,9},{2,4,8}};char (*p)[3]=a; //a为一维数组的数组名,类型为char (*)[3]

char *p=a[1]; //a[1]为二维数组的数组名,即{2,4,8}数组的首地址,类型为char *

char (*)p[2][3]=&a //&a为整个数组的首地址,类型为char (*)[2][3]

二维数组传参:

当定义了char a[2][3]={{1,3,9},{2,4,8}},如何将地址传入到函数中呢。函数对a数组进行修改呢。

void Func(int (*array)[10]);  注意*array需要用括号括起来。

这种形式的传参是1个指针,指向10个元素的数组,因为[]的优先级比*的优先级高,故*array必须用括号括起来。

#include "stdio.h"

void exchange(char (*p)[3]);int main(int argc, char *argv[])

{char a[2][3]={{1,3,9},{2,4,8}};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("exchange\n");

exchange(&a[1]);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]);

}return 0;

}void exchange(char (*p)[3])

{char tmp=(*p)[0];

(*p)[0] = (*p)[2];

(*p)[2] =tmp;

}

9bd134489889c73676c5d5e175acae51.png

例子解析:exchange(&a[1])将{2,4,8}数组的首地址传递给exchange,exchange使用(*p)获得{2,4,8}的地址,然后用(*p)[0]、(*p)[1]、(*p)[2]偏移并修改{2,4,8}数组的值。

void Func(int *array[10]);

这种形式的传参是10元素的数组,每个元素都是指向int型的指针。

#include "stdio.h"

void exchange(char *p[2]);int main(int argc, char *argv[])

{char a[2][3]={{1,3,9},{2,4,8}};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("exchange\n");char *p[2];

p[0] = a[0];

p[1] = a[1];

exchange(p);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]);

}return 0;

}void exchange(char *p[2])

{char tmp=p[1][0];

p[1][0] = p[1][2];

p[1][2] =tmp;

}

a1d1efcebab16487323271966950a04f.png

例子解析:先使用char *p[2]定义了2个元素的数组,每个元素都是char *型,然后将a[0]和a[1]的地址赋给p[0]和p[1],exchange函数接收到p[2]的地址,使用p[1]就能得到a[1]的地址,然后使用p[1][0]、p[1][1]、p[1][2]偏移到a[1][0]、a[1][1]、a[1][2]。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值