精华内容
下载资源
问答
  • 为什么数组变量不能赋值字符串常量 好几年不碰C语言了,遇到了个很初级的问题居然一时间懵了,问了一下身边的人居然也解释不清,记录一下。 char c[10]; printf("c = %s\n",c); 大家都知道这种写法是错误的,但是...

    为什么数组变量不能赋值字符串常量

    好几年不碰C语言了,遇到了个很初级的问题居然一时间懵了,记录一下。
    
    char msg_array[10];
    msg_array = "hello world";
    printf("msg_array = %s\n",msg_array);
    

    大家都知道这种写法是错误的,但是为什么是错的呢?

    在《c与指针》这本书里就提到过:
    字符串常量的直接值是一个指针,而不是这些字符本身。

    而我们都知道数组名本身就是一个指针,且其指向的地址是不可以改变的。
    所以c=“hello”; 这条赋值语句就相当于在改变数组的地址常量,这显然是错误的。

    这里还有个问题,在数组变量初始化时是可以成功赋值字符串变量的:

    char mess_array[10]="hello";
    printf("msg_array = %s\n",msg_array );
    

    打印一下地址值:

    printf("string:%p\n", "hello world");
    char msg_array [10]="hello";
    printf("msg_array :%p\n", msg_array );
    return 0;
    

    结果:

    string    :0000000000404000
    mess_array:000000000062FE00
    

    可见,并不是字符串常量把地址赋给了数组。 问了一下别人说是编译器的问题,编译器在初始化时做了很多内部工作。
    初始化后数组内的字符实际上已经和字符串常量"hello"没什么关系了。

    同时也看一下指针:

    char *ptr;
    printf("ptr:%p\n", ptr);
    
    ptr = "hello world";
    printf("ptr_new:%p\n", ptr);
    
    char *ptr2 = "hello world";
    printf("ptr2:%p\n", ptr2);
    

    结果:

    ptr       :0000000000000001
    ptr_new   :0000000000404000
    ptr2      :0000000000404000
    

    可见无论是初始化还是赋值,指针都会指向字符常量的地址。

    注意:数组名指向的地址是不可改变的,而普通的指针变量可以变。

    谁要有更好的解释还请不吝赐教🙏。。

    展开全文
  • 能对字符数组赋值不能为什么有的视频出现了这种操作?
    • 如图s.ch=“wangdao”,s是结构体变量,char ch[10]是数组,我们要关注的是ch=“wangdao”这个等式对不对。不对,这里只是逻辑上说一下数组ch的内容,供理解的,不是赋值操作,千万不要误解了。
    • 但是引出了另一个问题,打印数组名输出的是啥? 数组内容,不是地址。
    • 数组名存储的的是数组首地址,打印其他类型的数组名,打印的都是一串地址,只有字符数组打印出去的是字符串。
    • 因为”\0”这个结束符,是专门服务于字符数组的,是字符数组的结束符。因此打印字符数组时,内部可以知道在哪结束读取,不像其他类型的数组没有个”边界”。
    • 这也是字符数组的特殊用法,打印数组名即代表输出里面存储的字符串。
      ,在这里插入图片描述
      作者拙见,欢迎大家批评指正
    展开全文
  • 不能直接赋值,这是一定的,因为有太多的不确定性,容易发生错误赋值可以使用strcpy函数,strncpy函数,或者sprintf函数都行,直接等于是不行的~~~~规定不能整体引用,只能单个引用赋值除了按字符串输入赋给字符数组,...
    不能直接赋值,这是一定的,因为有太多的不确定性,容易发生错误

    赋值可以使用strcpy函数,strncpy函数,或者sprintf函数都行,直接等于是不行的~~~~

    规定不能整体引用,只能单个引用
    赋值除了按字符串输入赋给字符数组,或者初始化为字符串外,一般只能单个元素赋值
    数组名是一个地址常量,不允许改变,但是数组中的元素是变量,可以改变赋值(数组名这个地址[常量]就是元素[变量]的存放位置)
    a[]是一个常量,但是a[0]是一个变量

    展开全文
  • 1.可以将字符串赋值给指向字符的指针p,而不能将字符串赋值给一个字符数组。 char a[10]="hello";//正确的。 char a[10];a="hello";//错误的 char *a ="hello";//正确的 第一种写法:即char a[10],开辟了10个字节...

    参考文章:c语言中,为什么字符串可以赋值给字符指针变量
    1.可以将字符串赋值给指向字符的指针p,而不能将字符串赋值给一个字符数组。

    char a[10]="hello";//正确的。
    char a[10];a="hello";//错误的
    char *a ="hello";//正确的
    

    第一种写法:即char a[10],开辟了10个字节大小的空间,这里的字符串“hello"已经不是常量了,类似于a[0]=‘h’,a[1]=‘e’,a[2]=‘l’,a[3]=‘l’,a[4]=‘o’,a[5]=’\0’;它被存放在栈区。

    第二种写法:a=“hello”,则是错误的;因为数组的地址a为一个常量,"hello"其实代表的是存储这些字符的地址,(位于常量区),而非代表字符本身。

    如下所示:会报错:因为运算符的左边应该是一个“左值”。所谓“左值”就是指在程序中占用内存空间、可以被修改的量,比如各种变量。 而数组的地址:是一个确定的值。

    第三种写法:"hello"位于常量区,即为常量字符串,”hello"是其实代表的是h首元素的地址;因为hello为常量字符串,更好的写法是: const char *a=“hello”;

    struct PepInf
    {
    	int age;
    	char name[10];
    	char gender[10];
    };
    void InitPeo(struct PepInf *pc)
    {
    	pc->age = 20;
    	pc->name = "tianxin";//报错!	1	IntelliSense:  表达式必须是可修改的左值。	
    	pc->gender = "women";
    }
    

    c语言中赋值应该采取strcpy的方式,这里就不会出问题啦!

    strcpy(pc->name, "tianxin");
    strcpy(pc->gender, "女");
    
    展开全文
  • 不能赋值语句将一个字符串常量或字符数组直接给一个字符数组赋值。“ 那么str1=“China”是不是错的? char a[ ]='toyou'; 为什么是正确的呢?
  • 不能赋值语句将一个字符串常量或字符数组直接给一个字符数组赋值。“ 那么str1=“China”是不是错的? char a[ ]=‘toyou’; 为什么是正确的呢? 举例如下: char s[20];s=“helo”;这样是错误的,原因就是不能...
  • char s[5]="asdf";这句不是赋值而是初始化;讲的赋值语句是在程序执行中的赋值,就像...对于字符而言,要赋值就要采用strcpy(s1,s2)这个函数。、转自https://zhidao.baidu.com/question/229946335.html...
  • ``` #include int main(void) { char arr[100] = "123456"; arr[100] = "ubdyu" ;//(不能直接赋值) ...为什么字符数组不能够等号赋值字符串,而初始化可以? 初始化和赋值有啥区别吗?
  • 解释: 数组名为地址(这就是为什么数组用scanf赋字符串的时候不用加地址符“ & ”),地址是一个常量,常量不能出现在赋值“ = ”的左侧。(不挪窝) 顺便解释下: A,定义的同时赋值数组可以不加长度; ...
  • 字符数组或string

    2020-03-05 23:39:31
    字符串只能赋值给const char*变量,不能赋给char *变量。 const char* a = "abcde"; 程序自动在字符数组的末尾加’\0’。对于上述程序,a[5]是’\0’,输出空,a[5]之后的也可以索引到,输出的话也是单个字符...
  • 字符串字面量声明定义赋值给指针与数组的差异 字符串字面面量不能被修改,这是铁理!那么问题来了?为什么 char *p="abc"; *p='d';//(wrong!) char p2[]="abc"; p2[0]='d';//(right!) 这是为毛?为毛啊?不是...
  • //此处不能写code 51中code代表只读ROM 不能用来赋值 uint8 array_1[18]=" "; //如果想将另一个数组复制到这个数组 这个数组必须要有空间存储它才行 //在用VC6.0时不知道为什么不用写数组长度就可以成功,而...
  • char 类型指针与数组 赋值想到的

    千次阅读 2011-08-28 01:03:16
    上边的表达式为什么可以,而把p换成数组,然后再赋值就不行了 解释: 字符串常量”hello”出现在一个表达式中时,表达式使用的值就是这些字符所存储的地址,而不是这些字符本身。  所以,可以把字符赋值给指向...
  • 1、allowedFileTypes 、allowedFileExtensions 为什么没有效果?...2、全部使用“data-”来赋值又会发现javascript认为值是字符串不是json数组不能用join方法,还是要改一下fileinput.js转一下。
  • char *p = “hello”; 上边的表达式为什么可以,而把p换成... 所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。   char a[10] = “hello”; //这样可以,这种情况是c语言初始化所
  • 2.我想用指针数组来存,字符数组每个字符串元素的的地址,在给指针数组初始化时候,我先用了数组表示法({" aaa",“aaaa”}),我又尝试给每个指针数组的元素赋值,发现,仍然提示const char *类型的值不能用于初始...
  • cout 字符: " ; section *head, *p, *rear; head=rear=new section; head->data=flag; cout 符号:" << head->data ; while(length>=5){ p=new section; p->data=m[length-1+sigbit]-'0'+10*(m...
  • 数组为什么不能用b=a;赋值?那它储存在哪?printf输出字符串的参数表里为什么是个指针?为什么加上*运算符反而出错?......相信在初学数组和指针的时候, 对着课本你也会有许许多多类似的问题。而且,网上搜的答案和解...
  • 在C++定义的任意结构(类)中,可以通过一个该类的对象对另一个该类的对象进行赋值,哪怕需要传输的数据中有一个字符数组,请问这个赋值的原理是什么呢?为什么字符数组不能脱离结构相互赋值(=)呢?谢谢!
  • 作者:孤篷来源:SegmentFault 思否社区for…of及其使用我们知道,ES6 中引入 for...of ...for...of 允许你遍历 Array(数组), String(字符串), Map(映射), Set(集合),TypedArray(类型化数组)、arguments、NodeList对...
  • 首先,下边这个是给字符数组赋值,因为字符数组每个元素都占一字节,所以可以争取的输出数组元素 #include&lt;stdio.h&gt; #include&lt;string.h&gt; int main(){ char arr[5]; memset(arr,...
  • 字符数组字符串指针、 堆、 静态存储区 、字符赋值、c标准、编译器
  •  char *a[]定义了一个指针数组,注意不是char[], char[]是不能同时初始化为三个字符的,定义以后的a[]其实内部有三个内存位置,分别存储了abc\0,cde\0,fgh\0,三个字符串的起始地址,而这三个位置的内存地址却不是这三个...
  • 但是如果改成程序里那种将Response.Write语句放入循环里就不能显示出来了。就是想把Response.write放在循环里,每次查询多加1,用来实现行数越来越多,前端显示也就是相当于是动态的数据了。请问...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 236
精华内容 94
关键字:

为什么字符数组不能赋值