字符数组的定义与赋值必须在一个表达式里

今天写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;
}

  

时间: 2024-12-12 17:30:34

字符数组的定义与赋值必须在一个表达式里的相关文章

字符数组的定义与使用详细解析

1. 字符数组的定义: 用来存放字符量的数组称为字符数组. 形式数值数组相同.例如: char c[10]; 由于字符型和整型通用,也可以定义为int c[10],但这时每个数组元素占2个字节的内存单元. 字符数组也可以是二维或多维数组.例如: char c[5][10]; 即为二维字符数组. 2. 字符数组的初始化 第一种方法是分别对每一个元素进行赋值操作: 字符数组也允许在定义时作初始化赋值.例如: char c[10]={'c', '  ', 'p', 'r','o', 'g', 'r',

C语言中二维字符数组的定义和初始化

本篇日志关于二维字符数组的定义和初始化.我相信这篇文章属于菜鸟级的,高手请直接无视. 一般来说,我们可能会希望定义一个二维字符数组并且在定义的时候就用一些字符串来初始化它.比如说: 1 char testcase[30][MAX_LENGTH] = {"jo","vicent","tom","honey","gigi","lily","susan","pet

C语言字符数组的定义与初始化

C 语言字符数组的定义与初始化 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即'\0' ).2.字符数组与字符串在c 语言中,将字符串作为字符数组来处

实验九:二维数组和字符数组的应用

知识点: 二维数组的定义及引用:1.二维数组的定义: 二维数组的定义形式:类型名   数组名[行长度][列长度]:例如:        int  a[3][2]:        定义1个二维数组a,3行2列,6个元素: int   b[5][10]:        定义1个二维数组a,5行10列,50个元素: 二维数组的引用:行下标的范围:0~行长度-1:                        列下表的范围:0~列长度-1: 字符串的存储和运算可以用一维字符数组实现: 一维字符数组的定义

c语言字符数组的初始化问题

1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'}; 即把10个字符分别赋给str[0]到str[9]10个元素 如果花括号中提供的字符个数大于数组长度,则按语法错误处理: 若小于数组 长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.字符数组与字符串 在c 语言中,将字符串作为字符数组来处理.(c++中

c语言字符数组与字符串的使用详解

转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.

C语言学习笔记:19_数组-字符数组与字符串(常用字符串函数)

/* * 19_数组-字符数组与字符串.c * * Created on: 2015年7月7日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> #include <string.h> /** *一:字符数组:就是存放字符的char[]数组 * 由于c语言中没有像java,C#中的String(字符串),只有存放字符 的字符型数组当字符串使用(java中的String类也是对字符数组进行封闭的). * *

C语言-字符串(单个字符)和字符数组

一.字符串(单个字符)和字符数组的定义 1.单个字符的定义 char i = ‘x’ (单个字符的定义) 字符串创建后为常量无法修改 2.字符数组的定义 char i [4]=”xxxx”; char i []=”xxxx”; char i [4]={‘x’’x’’x’’x’}; 其中定义的数组的元素数要比实际赋值的数量多一,用于存放\0位置 字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了. 二字符串(单个字符)和字符数组输入 1.scanf函

指针数组的定义和引用

指针数组是一种特殊的数组,指针数组的数组元素都是指针变量.指针数组的定义格式为:类型名称 *数组名称[数组长度];例如:float *pf[3];因为下标运算符[]的优先级高于指针运算符*,上述定义等价于:float * (pf[3]);说明pf是一个含有3个元素的数组,数组元素为指向float型变量的指针变量.又如: int *pn[5]; /*定义一个5个元素的指针数组,数组元素为指向int型变量的指针变量*/char *pc[10]; /*定义一个10个元素的指针数组,元素为指向char型