数组为什么是指针常量?

下面的程序为什么编译错误?
#include<stdio.h>
void main(void)
{
char xingming[50];
xingming[50]="张三";
printf("姓名:%s\n",xingming);
}

①char xingming[50]="张三"; //这样可以;
②char xingming[50]; xingming[50]="张三"; //这样就不行了

原因如下:
①的意思相当于:定义一个大小为50的字符数组,第一个字符(xingming[0])值为‘张’,第二个字符(xingming[1])的值为‘三’,其余字符(xingming[2]至xingming[49])值为空;
②有两个错误:(1)数组越界:数组xingming有50个元素,但下标是从0开始至49的,没有到50;
(2)xingming[50]在这里不是定义,所以表示下标50的元素(一个元素,即一个字符),而后面给的值确是一个字符串;

说明:
数组定义时,后面的等于相当于给每个元素分别赋值,如果值不够,后面的元素值就为0(或者空),而除定义之外,任何地方,数组名加下标都表示一个元素;另外补充一点:数组定义时如果,要求给定的元素个数等于定义的元素个数,中括号里面的数值可以不要,如:
int a[]={1,2,3,4}; //这句话相当于定义了一个大小为4的int型数组,各个元素的值分别为1,2,3,4;
a[3]=5; //这句话相当于将第4个元素的值改为5;
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-06
  数组名绝对不等于指针,而且不是指针。
  数组名是指针常量,地址是绝对的,score指向受保护,但首地址的内容可以改变,所以数组首地址应该是指针常量int *const score。
  指针是一个变量,变量的值是另外一个变量的地址。那么,既然指针是变量,那么指针必然有自己的存储空间,只不过是该存储空间内的值是一个地址值,而不是别的内容。
第2个回答  2012-11-15
1、类型不匹配 "张三"是个字符串数组,
而xingming[50]只是数组中一个元素,
是char类型的、
这是数组初始化问题,任何数组都不允许这样初始化
2、数组在定义后,系统就会为其分配一个连续的存储空间,
而数组名对应这段连续存储单元的首地址,即第一个元素的地址,
这是个定值,是不能改变的,是个常量.
如果是个变量,那么变量是可以赋值的,比如int b = 1;
但是数组名是个常量,比如char xingming[50];的首元地址是100,
那么xingming就是500这个值,500 = 1,这样行吗,显然是不可以的,
即数组名不能赋值
所以数组名是个指针常量
第3个回答  2012-11-15
数组只能在定义的时候赋值,拷贝内存必须用到memcpy
memcpy(xingming, "张三");
这个跟指针常量没有关系,但数组可以看成是指针常量,因为指针可以++、--,但数组不行
举个例子:
int a[100];
a++; // 错误,数组不能+=
int* p = a;
p++; // 可以,因为p是个变量
const int* q = a;
q++; // 错误,因为q是个常量指针,指向的地址不可变
第4个回答  2012-11-15
char xingming[50]="张三"; //这样是对的


char xingming[50];
xingming[50]="张三";
这样是错的!
xingming[50]表示第51个数组元素(字符型),因此不能这样赋值
相似回答