一个C语言关于数组的问题,求解答

char str[9]={"good,bye"};//这里只有8个字符,问什么数组的元素个数必须要是9呢?改成8就出现错误了

char str[2][9]={"good,bye"};//这个二维数组是2行9列,那就可以存18个字符啊?但是为什么如果改为[2][8]就不正确了。而且我觉得存储8个字符用[2][4]就够了啊。

还有两个小问题 就是char (*s1)[10] 这条语句是什么意思?是定义了一个指针?

puts(s1[0]);
puts(s1[1]);
这两个语句又是什么意思

第1个回答  2015-02-10
1 第一个问题, 每个字符串末尾都默认有一个'\0'字符,因此声明的时候多一个字符
2 二维数组初始化,不指定第一行,和第二行,默认之存储在第一行,第二行全部为零
char str[2][9]={"good,bye","good,bye"};这样就可以了,和第一中情况一样,就不能改为[2][8]

3 定义了一个数组指针,可以指向一位数组,比如:
char *p;
char (*s1)[10];

p=s1;
那么p[0]就相当s1[0],p[2]就相当于s1[2]以此类推
第2个回答  2015-02-10
C语言字符串默认会在末尾加一个字符'\0'表示字符串结束,所以需要9个字符
二维数组一样的道理
char(*s1)[10]表示定义char类型的指针数组,就是10个char类型的指针
puts(s1[0]) 表示从把s1中串输出
第3个回答  2015-02-10
字符数组要比实际字符数多出一个,是给'\0'留的位置,不然无法判断在哪里结束字符串。

二维数组也是这个道理。

char (*s1)[10] 定义的是指针数组s1,数组s1的元素类型是指向字符的指针,也就是字符串。

puts()函数就是输出字符串,puts(s1[n])就是输出数组s1的某个元素。
第4个回答  2015-02-10

    字符后边系统会自动加一个‘\0’,所以需要多一个空间

    你那样赋值,只会把那8个字符赋给第一个数组

    第一了一个指针数组

    puts是输出吗?我不常用C语言的函数。那么那两句的意思分别是输出s1数组里第一个和第二个数据

第5个回答  2015-02-10
第一个问题,因为字符串是以\0结尾的,没有\0就没有结尾,所以比看上去多一个字符。
第二个问题,这个是二维数组是一个2行9列的表格差不多~所以也是会报错~因为他的初始化格式的{“....”,“....”}你的还是算一个的~追问

第二个问题还不太明白- -!能否再详细一点 good,bye
就算这个字符串实际是有9个字符,但是二维数组用[2][5]也不行吗?

追答

char str[2][9]={"good,bye"};在初始化的时候如果的格式是={"good,bye","good,bye"}这样子才是全部初始化,那显而易见的就是,你的只是初始化了第一个对不对,那第一个你定义少了是不是还是报错呢~
char (*s1)[10] 是定义了一个指针,指向的是一个数组,puts是输出~就是输出s1的第一个和第二个值

本回答被提问者采纳

关于C语言中数组定义问题
(1)在堆栈段中分配内存,由于太大无法分配,所以错误。(2)在数据段中分配内存,数据段可以分配,无错误。(3)数组比(1)需要的内存少,在堆栈段大小范围内,可以分配,无错误 (4)同(3)

一道C语言数组的题目。求指点
1.首先一点是主函数写int main(),写void main()的话是错的,至于为什么就不要深究了吧,以后会懂的,现在给你说你也搞不懂,这就是规律,没办法。2.你这个地方肯定就是想从键盘输入一个数,而这个数也就是数组的长度。但是这样是不可以的,静态数组定义的时候必须指出它的大小,不然肯定会出错,...

关于c语言数组的一些疑惑?
在C语言中,array[10]有两种含义:①它指含有10个元素的数组array,如:int array[10];②它指数组array的第10号元素,如:array[10] =5;因此,对于使用数组array[10](这里,你要把array[10]理解成含有10个元素的数组array,而不能理解成第10号元素)做形参,只写array[]即可(只写一个空的中...

c语言中关于数组的问题,求解释
A a[0]+4 错 a[0]是第一个元素,这表示首元素加4的值 B *a+4 错 *a同a[0]是一个意思,a是数组名,首地址,*a就表示首元素 C *(a+4) 正确,等同于a[4] 。 a是数组名,首地址,a+0是第一个元素的地址,a+1是第二个,。。。a+4是第5个元素的地址, 再*操...

c语言数组问题
问一:c语言开辟数组,如果里面存的是整数,那么没有复制之前,数组中默认的值为零,还是乱码。答:C语言声明数组变量时,只分配相应的空间和地址,而不对里面存放的数据初始化。不管是int、float、还是char型等,即里面存的无论是整数、小数还是字符,再没有复赋值之前,数组中默认的值都是乱码,而不...

C语言的数组和指针问题,谢谢高手的解答!
总结,问题的关键在于,数组名相当于一个指向于这个数组第一个元素的指针。3)所以,int A[2][3][4]={0};A是一个三维数组,其中A[0]和A[1]都是它的元素,A[0]是第一个元素。所以, A是一个三级指针,指向了这个数组的第一个元素A[0],而A[0]是一3*4的二维数组。而A[0]是一个...

C语言,关于求数组长度的问题!
一、如果参数是指针变量(无论什么类型的指针)其结果都是4 二、如果参数是是数组,会返回数组所占空间的大小,即:int a[n] ; sizeof(a)=n*sizeof(int) ;三、如果参数是个变量类型,则会返回这个类型所占空间的大小。sizeof(char)=1 sizeof(int)=4 sizeof(double)=8 具体一个变量类型所...

c语言的一道关于数组的编程题
⑶如果上一个数的行数为1,则下一个数的行数为n,列数加1。如果上一个数的列数的n时,下一个数的列数为1,行数减1。 ⑷如果按上面的规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。include <stdio.h> #define N 16 \/\/N可修改 int main()...

c语言二维数组问题求解
c语言的数组在定义时的方括号里的数字就是数组的大小,比如 char ch[100],数组大小就是100,但是多数组进行操作时,是从0开始的,ch[0],就是第一个,ch[99]是第100个。这道题目 int x[2][3],表示一个2行3列的二维数组,所以c是正确的 ...

c语言关于数组的一个问题
纠正楼上一个说法,注意此处是个语义错误但并不是语法错误;实际编译中编译器可能会出warning但编译是可以通过的,因为c是个弱类型语言,指针和char都被视作数值类型,能够进行各类自动转换。关于题主的问题,注意此处加的是'3'而不是3,即ascii码的51。str偏移51实际造成数组越界。

相似回答