C语言中,数组是数组,指针是指针,两者是完全不同的,通俗的话来说,一个是地址符号,一个是存储变量地址的变量。
但是有时候他们又是可以相同的。
于是首先,我们应该知道两者在什么时候是“相似”的。
1、“表达式中的数组”就是指针;
2、C语言把数组下标作为指针的偏移量;
3、“作为函数参数的数组名”等同于指针;
对数组的引用如a[i]在编译时总是被编译器改写成*(a+i)的形式。C语言之所以把数组形参转换为指针是处于效率的考虑,由于不可能对整个数组进行拷贝,而是“所有的数组在作为参数传递时都转化为指向数组起始地址的指针”。
摘自《Expert C Programming》---Peter Van Der Linden
手动实验1:
[lanux@localhost Program]$ cat pointer_and_array_01.c
#include <stdio.h>
char ga[8]="goblecha";
void print_array(char arr[])
{
printf("/nIn Function print_array:/n");
printf("arr address,on goble ga:%d/n",&arr);
printf("arr[0] address,on goble ga:%d/n",&(arr[0]));
printf("arr[1] address,on goble ga:%d/n",&(arr[1]));
}
void print_pointer(char *ptr)
{
printf("/nIn Function print_pointer:/n");
printf("ptr value, on goble ga:%d/n",&(*ptr));
printf("ptr address,on goble ga:%d/n",&ptr);
printf("ptr[0] address,on goble ga:%d/n",&(ptr[0]));
printf("ptr[1] address,on goble ga:%d/n",&(ptr[1]));
printf(" ++ptr value,on goble ga:%d/n",++ptr);
}
main()
{
printf("/nIn the main:/n");
printf("goble ga adrress:%d/n",&ga);
printf("goble ga[0] address:%d/n",&(ga[0]));
printf("goble ga[1] address:%d/n",&(ga[1]));
print_array(ga);
print_pointer(ga);
printf("/n");
return 0;
}
[lanux@localhost Program]$ gcc -W pointer_and_array_01.c -o test
[lanux@localhost Program]$ ls
a.out notes.1 pointer_and_array_01.c test
[lanux@localhost Program]$ ./test
In the main:
goble ga adrress:134519160
goble ga[0] address:134519160
goble ga[1] address:134519161
In Function print_array:
arr address,on goble ga:-1077022384
arr[0] address,on goble ga:134519160
arr[1] address,on goble ga:134519161
In Function print_pointer:
ptr value, on goble ga:134519160
ptr address,on goble ga:-1077022384
ptr[0] address,on goble ga:134519160
ptr[1] address,on goble ga:134519161
++ptr value,on goble ga:134519161
[lanux@localhost Program]$
初始化的全局变量ga存储在全局区,而存储在栈区的函数参数变量,如arr[],*ptr,其实都是一个指针,即一个存储地址的变量(这里存储的地址指向全局字符数组ga)。
01:26:10