字符数组的定义与赋值

今天写c程序时遇到这样的编译问题

char str [10];
str [] ="welcome";

报语法错误

char str [10];
str="welcome";

也报语法错误

 

这是为什么呢?

如果是其它的变量,比如:int a=1;
可以分写成两个表达式:
int a;
a=1;
可是字符数组 char str []="welcome";
就不可以写成:

char str [10];
str [] ="welcome";

 

最后的解释是:

char str [10];

这条语句执行后,str是一个常量,指向开辟的空间的首地址。
str [] ="welcome"; 
这句的 str[] 这样引用本身就是不对的,只有在定义时才能这样:
char str[]="welcome";
int a[]={3,4};
其它地方array[]是非法的。

如果改成这样:
str="welcome";
还是不对,因为此时str是一个常量,你不能给一个常量赋值。

但是如果这样定义:
char *str;
然后就可以这样用了:
str="welcome";

可是好像又不能看懂了,为什么这里就可以”str="welcome";”了呢?

其实这句话表示将“welcome”字符串的首地址赋值给str,再解释就是:先将welcome放在一片内存空间里,然后把这片内存空间的首地址给str。

在程序里面,指针所在的空间和字符串所在空间是不一样的~、

用一段代码看看char str1[]="welcome";和 char *str2;str2=”welcome”;的区别

#include "stdafx.h" 
#include "string.h" 
#include "stdio.h"

int main(int argc, char* argv[]) 
{   char str1[]="welcome"; 
    char *str2; 
    printf("===========str2还没有赋值的时候的值=======\n"); 
    printf("此时的str2相当于一个野指针,*str2是没有初始化的\n\n"); 
    printf("str1==%d,str2==%d\n\n\n",str1,str2); 
    str2="welcome"; 
    printf("===========str2赋值后=====================\n\n"); 
    printf("str1==%d,str2==%d,str[1]==%c,str2[1]==%c,*str2==%s\n\n",str1,str2,str1[1],str2[1],str2); 
    printf("&str1[1]==%d,&str2[1]%d",&str1[1],&str2[1]); 
    printf("\n\n以上两行打印可知,就算str1和str2代表的字符串内容是一样的,但是这两个所在的存储空间也是不一样的!\n\n"); 
    return 0; 
}

 

  

 

 

image

 

转载于:https://www.cnblogs.com/hhddcpp/p/4304573.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值