指针与数组

指针与数组

指针:数据在内存中的地址也称为指针,如果一个变量存储了一份数据的地址,我们就称它为指针变量。

数组:一组连续的类型相同的变量的集合。

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);

你可能感兴趣的:(指针与数组)