数组名和字符指针可以相互装换,但是他们二者在使用上却有不同之处:
//=======第一个不同,指针可以相互赋值,但是数组名却不可以
// 数组名作为数组中第一个元素的地址,其地址也是一个地址,但是字符指针是另外单独开辟的一个空间,指向一个内存单元,
//因此数组名的地址是固定,自然不能相互赋值了
char *s1="abc";
char *s2="efg";
char ch1[]="123";
char ch2[]="456";
/*
s1=s2; 可以
ch1=ch2; 不可以
*/
//============第二,取值的方式
//==编译器符号表有一个符号s1,他的地址为1244996,然后取地址1244996的内容,就是abc的地址"4337500",然后把i和4337500相加,然后取出(i+4337500)的内容.
//===编译器符号表有一个符号 ch1 地址为 1244988(它前面的单元式指针s1,s2,共占8个字节,这是编译器分配在栈里的
//然后首先取i的值,把i和1244988相加,然后取出(i+1244988)的内容.
printf("s1 地址:%d/n",&s1); //存放指针的内存地址
printf("s1[0] 地址:%d/n",&s1[0]); //字符串第一个字符的地址 注意:他们是不同的
printf("s1[1] 地址:%d/n",&s1[1]); //字符串第二个字符的地址
printf("ch1 地址:%d/n",&ch1);
printf("ch1[0] 地址:%d/n",&ch1[0]); //输出ch1和ch1[0]是都是数组第一个元素内存单元的地址
printf("ch1[1] 地址:%d/n",&ch1[1]);
//同样用作函数参数的时候,因为会进行参数拷贝,用指针回比用数组要节省空间
运行结果: