c语言中数组名与指针的区别与联系
c语言中数组名与指针的区别与联系:今天在工作中定义数组的时候习惯性的使用char型指针后直接等于字符串,但在编译通过后运行的时候产生了段错误,因为着急就(整个函数代码还是比较多的)没仔细看代码。
只是抱着试试看的心态,将定义换成了数组后等于字符串的形式,居然没有在出现段错误,感到很奇怪(刚干程序员没多久,一直以为数组名就是指针呢)。在这里做个记号,提醒我以后有时间的时候查一下段错误的原因。今天先总结一下刚从网上找到的数组名和char型指针的区别和联系。
1.数组名不是指针;
2.数组名可以当做一个指针常量使用;
3.指向数组的指针,就紧紧是一个指针;
4.当函数形参使用数组名是,其会被转换成一个单纯的指针。
以下是证明上面四点的论据:
1. 首先数组名不是指针,这很容易证明。
#include #include int main() { char str1[]="Hello world!"; char *str2="Hello world!"; printf("Size of str1 is: %d\n",sizeof(str1)); printf("Size of str2 is: %d\n",sizeof(str2)); printf("Size of char is %d\n",sizeof(char)); return 0; }
执行结果如下:
Size of str1 is: 13
Size of str2 is: 8
Size of char is 1
显然一个指针的长度应该是8(我是在64位机器上编译的),而不应该是13,。 至于第三个打印只是想说明sizeof是一个运算符。
2.数组名是一个常量指针。
#include #include int main() { char str1[20] = "Hello world!"; char str2[20]; strcpy(str2,str1); printf("str1:%s\n",str1); printf("str2:%s\n",str2); return 0; }
这段代码编译没有出错
输出是
str1:Hello world!
str2:Hello world!
strcpy函数原型是char *strcpy(char *dest, const char *src); 显然它的两个参数均为char型指针,而上面代码中传入的str1,str2均为数组名,这说明数组名的确可以当成指针使用。至于为什么是指针常量呢,请看下面一段代码。
#include #include int main() { char str[20]="Hello world!"; str++; return 0; }
在编译是报错了:
main.c: In function ‘main’:
main.c:6: error: lvalue required as increment operand
str虽然可以当做指针使用但是不能对他进行++,--,或者其他运算,综合上面两个例子,我们基本可以认为它可以当做一个常量指针使用。
3.指向一个数组的指针,你也还是一个指针而已。
#include #include int main() { char str1[]="Hello world!"; char *str2=str1; printf("Size of str1 is: %d\n",sizeof(str1)); printf("Size of str2 is: %d\n",sizeof(str2)); return 0; } 这段代码运行结果是: Size of str1 is: 13 Size of str2 is: 8 4.作为函数形参的数组名将会失去其数组名的地位,变成一个普通的指针。 #include #include int fun(char str[]) { printf("Size of str is:%d\n",sizeof(str)); } int main() { char str1[]="Hello world!"; fun(str1); return 0; }
结果是:
Size of str is:8
好了今天就写这么多,记得段错误。