1.指针和数组
在c语言中,数组的名称即数组首元素的地址,例如char a[],声明的是一个数组,数组名a即这个数组首元素的地址。
相对应的char* a声明的是一个char类型的指针变量,变量名为a,a存储的也是一个地址。他们是不是很相似?
例如,在下面这个代码块里,输出的str和取得的str[0]的地址是一样的,表明数组名存储的就是数组首元素地址。
char str[120];
printf("请输入你的英文名:");
scanf("%s0",str);
printf("str的地址是:%p\n",str);
printf("str的地址是:%p\n",&str[0]);
2.argc和argv
在linux下编写的c语言程序里,我们常常会见到argc和argv,他们是什么呢?
原来argc是argument count,argv是argument value,分别是参数个数和参数值。
通常传入的时候的方式是int main(int argc,char* argv[])或int main(int argc,char** argv)。
那他们有啥区别呢?
对于char* argv[],它声明的是一个指针类型的数组,也就是声明了一个数组,数组的元素是一个个类型为char*的变量(字符串)。
对于char argv,声明的是一个指针,argv指向了char 类型的指针,或者说是字符串变量。
当char argv[]作为函数的形参时,数组会自动退化成指针。也就是说在这里*argv[]=**argv
,也就是可以理解为没啥区别。
总而言之,不管是char*argv[] 还是char **argv,这里的变量名argv就是用来一个指针,指向字符串变量的首地址。
我们可以用下标"argv[x]"的方式索引。
例如以下代码:
在linux中运行./test.c Nankee时,
它会返回:
这是test1
Nankee
因为Nankee是传入的第二个参数,可以用argv[1]索引。
//test.c
#include<stdio.h>
/*输入: ./test1.c Nanke
*/
int main(int argc,char **argv){
if(argc != 2)
{
printf("请输入诸如\"%s char[]\"的命令行\n",argv[0]);
return -1;
}
else
{
printf("这是test1\n");
printf("%s\n",argv[1]);
}
return 0;
}