问题01:数组定义后默认值是多少?
这个问题要分情况:
- 数组在定义时进行了初始化
- 数组在定义时没进行初始化,后面再赋值
情况一:数组在定义时进行了初始化
当{ }中值的个数少于元素个数时,只给前面部分元素赋值。例如:
int a[10]={12, 19, 22 , 993, 344};
表示只给 a[0]~a[4] 5个元素赋值,而后面 5 个元素自动初始化为 0
当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 0:
- 对于short、int、long,就是整数 0
- 对于char,就是字符 '\0'
- 对于float、double,就是小数 0.0
我们可以通过下面的形式将数组的所有元素初始化为 0:
int nums[10] = {0};
char str[10] = {0};
float scores[10] = {0.0};
由于剩余的元素会自动初始化为 0,所以只需要给第 0 个元素赋值为 0 即可
情况二:数组在定义时没进行初始化,后面再赋值
#include <stdio.h>
int main()
{
int a[10]; //定义时不初始化
a[0] = 1; //给其中一个元素赋值
printf("a[0]=%d\n",a[0]);
printf("a[1]=%d\n",a[1]);
return 0;
}
结果:所以如果不在定义时就初始化数组的话,数组元素全是随机值,后面只能逐个更改
a[0]=1
a[1]=73896
问题02:普通数组与字符串数组初始化区别
普通数组有以下2种初始化形式:
int a[4]={1,2,3,4};
int a[]={1,2,3,4};
字符串数组有以下6种初始化形式:
char str[6]={'h', 'e', 'l', 'l', 'o', '\0'};
char str[] ={'h', 'e', 'l', 'l', 'o', '\0'};
char str[6]={"hello"}; //自动添加字符结束符
char str[] ={"hello"};
char str[6]="hello";
char str[] ="hello";
问题03:字符数组初始化时有没加'\0'区别
#include <stdio.h>
void main(void)
{
char c1[]={'I',' ','a','m',' ','h','a','p','p','y'};//没加'\0'
char c2[]="I am happy";//自动补'\0'
int i1=sizeof(c1);
int i2=sizeof(c2);
printf("%d\n",i1);
printf("%d\n",i2);
}
结果:10 11
sizeof()函数可以正确求出其所占的内存大小;但用strlen()函数不能正确求出其长度,因为strlen()是通过 \0 判断字符串结束的
问题04:将数组赋值给另一个数组
Java中数组赋值给另一数组的写法:
public class Test {
public static void main(String[] args) {
int[] a;
int[] b={1,2,3};
a=b;
}
}
C不能像下面那样:
int main(){
//int a[]; 会报错,提示没有指明容量
int a[5];
int b[5]={1,2,3,4,5};
a=b; //数组绝不等价于指针
}
注意的点:
- 数组都可以用memcpy进行数组间的复制,但strcpy专用于字符串数组之间的复制
- memcpy有没有拷贝字符串最后的’\0’字符和函数本身无关系,memcpy支持拷贝字符串末尾字符,能不能拷贝字符串的末尾字符取决于传输的参数size_t n的值。
- strcpy能够自动补全字符结束符
问题05:用数组输出26个字母的优化
不好:
#include <stdio.h>
int main(){
char str[30];
char c;
int i;
for(c=65,i=0; c<=90; c++,i++){
str[i] = c;
}
printf("%s\n", str);
return 0;
}
在 VS2015 下的运行结果:ABCDEFGHIJKLMNOPQRSTUVWXYZ口口口口i口口0 ?
优化:
#include <stdio.h>
int main(){
char str[30] = {0}; //将所有元素都初始化为 0,或者说 '\0'
char c;
int i;
for(c=65,i=0; c<=90; c++,i++){
str[i] = c;
}
printf("%s\n", str);
return 0;
}
问题06:数组作为函数的参数
C中没有像Java一样有length,所以一般参数带了表示数组的长度参数numsSize,数组用指针*nums指示
int* twoSum(int* nums, int numsSize, int target){
...
}