指针与数组
指针:数据在内存中的地址也称为指针,如果一个变量存储了一份数据的地址,我们就称它为指针变量。
数组:一组连续的类型相同的变量的集合。
Here is the code example for array and pointer:
void arrayAsParameters(int array[]) {
//not array' size, but "int *" size, is 8 in 32-bit
printf("size of array parameter:%ld\n",sizeof(array));
}
int array[] = {1, 2, 3};
// code-1
printf("*array: %d\n", *array+1);//2
//code-2
printf("array[1]: %d\n", array[1]);//2
if (array+1 == &array[1]){
printf("array[1] == *(array+1)\n");
}
//code-3
arrayAsParameters(array);//array use as pointer by complier
int *p = array;
//code-4
printf("size of array: %ld\n", sizeof(array));// 12
printf("size of pointer: %ld\n", sizeof(pointer)); // 8
//code-5
p++;
array++;//complier error
//code-6
//in a.file
int array_int[] = {1, 2, 3};
//in b.file
extern int *array_int;//complier error
相同点:
- 数组(名)对象存储的值是首元素的地址,所以大多数情况下和指针是等效的。如 code-1 code-2所示
- 数组作为函数参数时,被作为指针来传递。如 code-3所示
不同点:
- 一些函数调用时,会被区分对待,如sizeof(),一个是指针占用的内存大小,一个是数组所有元素占用的内存大小. 如code-4
- 指针变量可以自增 自减,但是数组不可以。 如code-5
- 数组在定义和声明时,类型也必须一致。如code-6
字符串与数组
字符串:字符组成的数组即为字符串(C中没有 字符串 类型,但有此概念。)
如何初始化字符串/字符数组?
- 以数组的形式初始化:
char str1[6] = {'A','B','C','D','E','\0'};
char str2[ ] = {'A','B','C','D','E','\0'};
char str3[6] = "ABCDE";
char str4[ ] = "ABCDE";
以指针的形式初始化:
char *str5 = "ABCDE";//运行时初始化
逐个初始化
char str6[5] = {'\0'};
for(c=65,i=0; c<=69; c++,i++){
str[i] = c;
}
需要避免的错误有哪些?
- 字符串以'\0'为结束符,所以ASCII字符串str, sizeof(str) = strlen(str) + 1。如str1 str2, 而str3/4/5,编译器会自动在尾部插入该结束符。
- 数组长度长于字符串,长出的部分会自动置为'\0' 如str7, 短于字符串时,会带来潜在的问题, 如str8。
char str7[8] = {'A','B','C','D','E','\0'};// str7[7] == '\0'
char str8[3] = {'A','B','C','D','E','\0'}; //
- 字符串若不添加结束符,后边可以能会有乱码
特性
eg.整体格式输出
printf("%s", str1);