函数定义
参考书籍章节9.7
无论函数定义的参数是数组还是指针,在编译的时候,编译器都将在栈上开辟一个空间存放入参的地址,换句话说,也就是在函数内部都当做指针处理。
#include <stdio.h>
#include <stdlib.h>
char ga[] = "abcdefgijklm";
void my_pointer_func(char *ca)
{
printf("my_pointer_func\n");
printf("%#x \n", &ca);
printf("%#x \n", &ca[0]);
printf("%#x \n", &ca[1]);
printf("%#x \n", ++ca);
}
void my_array_func(char ca[])
{
printf("my_array_func\n");
printf("%#x \n", &ca);
printf("%#x \n", &ca[0]);
printf("%#x \n", &ca[1]);
printf("%#x \n", ++ca);
}
int main()
{
my_array_func(ga);
my_pointer_func(ga);
return 0;
}
my_array_func
0x61fe00
0x403010
0x403011
0x403011
my_pointer_func
0x61fe00
0x403010
0x403011
0x403011
多维数组
参考书籍章节10.1
- 数组的偏移量总是在编译时确定的,
arr[i][j]、int arr[5][10]、int *arr[10]
当你使用arr[i][j]时,你不能通过你的使用方式知道arr的声明是int arr[5][10],亦或是int *arr[10],以上两种声明,你都可以使用arr[i][j]这种形式来访问。但是需要注意的是,编译器生成的代码是完全不一样的!因为int arr[5][10]在编译时有了一块确定且连续的内存,编译器完全知道如果想对arr去做偏移,但是int *arr[10]却是灵活多变的,因为它只是有10个连续内存空间的整形指针而已,指针指向的空间是不确定的,所以编译器只能让程序运行时再通过计算算出偏移量,而第一种是在编译时就算出来了偏移量。
这里也体现了一部分哲学的内容,如果你想要点东西,就必须要牺牲点其他的东西,比如在这里,你想要灵活性,就牺牲了执行效率。
锯齿数组
参考书籍章节10.3
未完待续