复习一下数组和指针

来源:互联网 发布:日本人看中国知乎 编辑:程序博客网 时间:2024/05/16 08:59

由于这次复习是由上一篇blog写的main函数的输入参数引发的,所以这篇文章就从那里开始。

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

char *argv[ ]: 字符串数组,本质上是一个指针数组,

指针数组的意思是这是一个数组,数组的每一个元素都是一个指针(存放的都是一个地址),这个指针指向的元素是什么类型的就在最前面写上对应的类型(例如这里是char,表示的就是argv这个数组的每一个元素指针指向的都是一个字符串)

由于字符串经常用它的首地址表示,所以指针数组经常用来存放多个字符串(的首地址)。故又称char* xxx[]为字符串数组。

例如:char *a[5]={"red","yellow","blue","white","black"};

参考文章:

http://bbs.csdn.net/topics/320028180/


说到字符串数组,我们就要说到字符串,字符串在c语言中主要有两种存储方式:

1、用末尾是'\0'的字符数组来存储

char a[6]={'h','e','l','l','o','\0'};

这里我们就要说一下数组

定义不多说,都知道是同种数据类型元素的一个序列。

这里说几个当时老是混淆的地方。

数组的名称是一个地址常量,例如上面的例子,a中存放的是:这个数组首元素的地址。

但是有一个问题虽说a是一个地址常量但是&a依然是有意义的,他的结果依然还是首元素的地址。但是a和&a是有区别的。

区别就在于a+1和&a+1,前者表示a的第二个元素的地址,而后者表示跨出这个数组a的下一个地址。

详见:

http://bbs.csdn.net/topics/370005099

http://blog.csdn.net/wanwenweifly4/article/details/6424058

http://blog.csdn.net/erica_ou/article/details/52781176

关于其他字符串、字符串数组的一些知识:

https://www.cnblogs.com/bossren/p/6406910.html

2、用指针指向这个字符串

我们也可用一个指针指向一个字符串

例如:char *p = "abc"

p中就存放了这个字符串的首元素的地址。然而这个字符串常量是被存放在常量区的。

关于程序的存储方式:

字符串常量https://baike.baidu.com/item/%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B8%B8%E9%87%8F/4706938?fr=aladdin

字符串常量存放在哪个区中http://blog.csdn.net/daiyutage/article/details/8605580








我估计之所以数组指针采用这样的方式int *a[5],

int*表示的就是:*表示这是一个指针型的变量,int表示这个指针指向的是一个整型变量(我觉得本质上是告诉指针指向的这个东西的存储空间是多大,以防止指针+1时不知道该前进几个字节,这里指针+1需要前进4个字节,因为一般很多编译器int都是32位的)

a:变量名(数组名)

[5]数组元素的个数


忽然想到一个问题:指针数组一个元素有多大?

我觉得这跟内存的大小有关,内存越大,就需要越长的地址位数来进行寻址。