欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c语言中数组名与指针的区别与联系

程序员文章站 2022-11-30 18:53:12
c语言中数组名与指针的区别与联系:今天在工作中定义数组的时候习惯性的使用char型指针后直接等于字符串,但在编译通过后运行的时候产生了段错误,因为着急就(整个函数代码还是比较多的)...

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

好了今天就写这么多,记得段错误。