由于这次复习是由上一篇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]数组元素的个数
忽然想到一个问题:指针数组一个元素有多大?
我觉得这跟内存的大小有关,内存越大,就需要越长的地址位数来进行寻址。