C语言中的数组、指针数组、数组指针

定义一般数组

1、定义一个数组,一般想要获取的信息是,数组的某个元素的地址以及该地址内存储的内容。
比如定义一个字符串类型的数组变量,对其进行赋值:

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5   char buf[20]="beijing huanying";  //定义、赋值
  6 
  7   printf("%s\n",buf);               //输出buf数组的字符串
  8   printf("%p\n",buf);               //输出buf数组的首地址
  9   printf("%p\n",buf+1);             //输出buf数组第二个元素的地址
 10   
 11   printf("%c\n",buf[1]);            //输出buf数组第2~5个元素的存储内容
 12   printf("%c\n",buf[2]);
 13   printf("%c\n",buf[3]);
 14   printf("%c\n",buf[4]);
 15   
 16   printf("%p\n",&buf[1]);           //输出buf数组第2~5个元素的地址
 17   printf("%p\n",&buf[2]);
 18   printf("%p\n",&buf[3]);
 19   printf("%p\n",&buf[4]);

运行结果如下所示:

beijing huanying     //buf数组的字符串
0xbfa4de18           //buf数组的首地址
0xbfa4de19           //输出buf数组第二个元素的地址

e                    //输出buf数组第2~5个元素的存储内容
i
j
i

0xbfa4de19           //输出buf数组第2~5个元素的地址
0xbfa4de1a
0xbfa4de1b
0xbfa4de1c

以上运行结果可以推出下述几个结论:
1、buf代表数组的首地址,也是数组第一个元素的地址。
2、printf("%s\n",buf); 的运行结果是 beijing huanying,证明可以通过数组名输出数组的内容。
3、printf("%p\n",buf+1); 的运行结果是 0xbfa4de19,比首地址增加了1个字节,即一个char类型的长度
4、printf("%c\n",buf[1]); 输出某一元素所代表的内容,==printf("%p\n",&buf[1]);==打印该元素的地址。

指针数组(类似于1×N数组)

1、指针数组声明一个数组,用于存储一系列地址,存储的地址指向某一个数据类型。举例如下:

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5   char *str[3];                     //定义一个指针数组
  6   char strr[3]="127";               //定义一个字符变量的数组
  7   
  8   *str=&strr[0];                    //把字符变量的数组的首地址
  9                                       赋值给指针数组的第一个元素
 10   printf("%p\n",&strr[0]);          //字符变量数组三个元素的地址
 11   printf("%p\n",&strr[1]);
 12   printf("%p\n",&strr[2]);
 13   
 14   printf("%c\n",strr[0]);           //字符变量数组三个元素值
 15   printf("%c\n",strr[1]);
 16   printf("%c\n",strr[2]);
 17   
 18   printf("%p\n",*str);              //指针数组的三个元素
 19   printf("%p\n",*str+1);
 20   printf("%p\n",*str+2);
 21 
 22   printf("%c\n",*(*str));           //指针数组的三个元素指向的数值
 23   printf("%c\n",*(*str+1));
 24   printf("%c\n",*(*str+2));
 25 
 26   return 0;
 27 
 28 }

运行结果:

0xbfeefda9
0xbfeefdaa
0xbfeefdab
1
2
7
0xbfeefda9
0xbfeefdaa
0xbfeefdab
1
2
7

以上运行结果可以得出如下结论:
char *str[3];

1、 * str+i = &strr [ i ]
2、 * (*str+i) = strr [ i ]
3、对于数组strr来说,内存分配了3个字符串的长度,即3×1个字节。
1)若是定义的char strr[30],内存分配30×1个字节长度
2)若是定义的int strr[30],内存分配30×4个字节长度

4、对于指针数组,其变量名可以这么理解:
*str [3] 是一个有三个元素的数组,每一个元素的内存长度是一个指针变量的长度,即4个字节。

5、&str 表示str变量内存空间的首地址。(&str)+1表示下一个变量内存空间的首地址。二者之间的地址相差str变量内存空间的大小。

char *str[3];  
&str=0xbfd98a94          //2708
&(str)+1=0xbfd98aa0      //2720

字符串的数据类型内存布局如下所示:
在这里插入图片描述

数组指针(类似于N×1数组)

数值指针的声明方式是如下

int (*P) [3];

实际上,P是声明的一个指针变量,该变量内存储一个地址,指向一个长度为3×int长度的数组(该数组的首地址),所以称作数组指针。其内存逻辑如图:

在这里插入图片描述

1、P指向一个长度为3×int长度的数组,该数组有三个元素,(*P) [0],(*P) [1],(*P) [2].
2、数组(*P) [3]的首地址,也可以是数组的变量名,即(*P) ,其他元素的首地址在(*P) 的基础上做加法即可

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值