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) 的基础上做加法即可