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

今天在工作中定义数组的时候习惯性的使用char型指针后直接等于字符串,但在编译通过后运行的时候产生了段错误,因为着急就(整个函数代码还是比较多的)没仔细看代码,只是抱着试试看的心态,将定义换成了数组后等于字符串的形式,居然没有在出现段错误,感到很奇怪(刚干程序员没多久,一直以为数组名就是指针呢)。在这里做个记号,提醒我以后有时间的时候查一下段错误的原因。今天先总结一下刚从网上找到的数组名和char型指针的区别和联系。

1.数组名不是指针;

2.数组名可以当做一个指针常量使用;

3.指向数组的指针,就紧紧是一个指针;

4.当函数形参使用数组名是,其会被转换成一个单纯的指针。


以下是证明上面四点的论据:

1. 首先数组名不是指针,这很容易证明。



#include <string.h>
#include <stdio.h>
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 <stdio.h>
#include <string.h>
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 <string.h>
#include <stdio.h>
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 <string.h>
#include <stdio.h>
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 <string.h>
#include <stdio.h>
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



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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值