C语言中的数组、字符串列表

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、字符串列表用于存储一个字符串里每个元素的地址,该地址指向某一个数据类型的内存单元,这个内存单元里存储着一个数据类型的值。举例如下:

  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

以上运行结果可以得出如下结论:
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来说,内存分配了4份个字节的长度,一个指针是32个bite位即4个字节,用来存储地址。
1)若是定义的char *str[30],内存分配4个字节长度给 *str,内存分配30×1个字节长度给str;即 * str的数据类型是 *指针类型。
2)若是定义的int *str[30],内存分配4个字节长度 *str, 内存分配30×4个字节长度给str;即 * str的数据类型是 *指针类型。

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

猜你喜欢

转载自blog.csdn.net/qq_39982235/article/details/88618101