数组:
1、定义数组时,数组大小不能用变量定义,C语言并不支持,即使是const修饰的变量也不行,我们要杜绝这种定义方式。
错误示例:
int size = 20;
int c[size];
错误示例:
int a[10];
a[10] = 1;
图示:
int a[3][4] = {{1,2,3,4},{1,3,5,7},{2,3,5,6}};
4、scanf()、gets()、fgets()读取字符串时都不需要对数组名加&,但scanf() 无法读取空格和换行符,gets()无法读取换行符,前两者都可能导致数组的越界,fgets()可以读取空格与换行符,且不会导致数组越界。
用法示例:
char str1[100];
char str2[100];
char str3[100];
scanf ("%s",str1);
gets (str2);
fgets (str3,100,stdin);
错误示例:
char str[100];
str = "hello";
int a[5];
&a是数组的地址,要和数组首个元素的地址区分开。
a、&a[0]、&a在数值上相等,但&a意义不同。a+1或&a[0]+1跳过4个字节(跳过一个元素),&a+1跳过20个字节(跳过整个数组)。
7、数组指针与数组名的差异
(1)
int a[5];
int *p = a;
sizeof(a)的值为20;sizeof(p)的值为4。
数组指针不能代替数组名求数组长度。
(2)
int a[5] = {1,2,3,4,5};
int *p = a;
a++是无效的,p++可以使用。
数组名是一个常量,不能被改变。
8、定义指针时必须给它初始化,可以指向NULL,否则会成为野指针。
错误示例:
char *p;
错误示例:
char *p = "hello";
*p = 'w';
指针数组可以定义为int *a[10],二维数组指针可以定义为int (*p)[10],指向int a[3][10]。