知识点:
1.数组和指针。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void test(int arr[])
5 {
6 printf("In Func: size of the array is %d\n", sizeof(arr) ); //4 the pointer's size
7 }
8
9 void test_char(char arr[])
10 {
11 printf("In Func: sizeof the my_char is %d\n", sizeof(arr)); //4 the pointer's size
12 printf("In Func: strlen the my_char is %d\n", strlen(arr)); //11 the string's size
13 }
14
15 int main()
16 {
17 int array[100]={1,3,4,5};
18 char my_char[50]="hello world";
19
20 printf("In Main: sizeof the array is %d\n", sizeof( array) ); //400
21
22 printf("In Main: sizeof the my_char is %d\n", sizeof(my_char)); //50
23 printf("In Main: strlen the my_char is %d\n", strlen(my_char)); //11 the string's size
24
25 test(array);
26 test_char(my_char);
27 }
C语言允许把形参声明为数组,或者指针。编译器知道何时形参是作为数组声明的,但事实上在函数的内部,
编译器始终把它当做指向数组第一个元素的指针。
(也因为如此,这个指针的地址,与数组第一个元素的地址不相同。)
因此,但test和test_char函数中,sizeof(pointer)的大小都是4,为指针的大小。
也因此,只能传给函数,数组的大小,因为无法用sizeof推出数组的大小。
2.有一种操作只能在指针里进行,而无法在数组中进行,就是修改它的值。
数组名是不可修改的左值,他的值是不能改变的。也可看做常量指针。
3.数组和指针的可交换性总结
用a[i]这样的形式对数组进行访问,总是被编译器“改写”成*(a+i)这样的指针访问
指针始终就是指针。它绝不可以改写成数组。你可以用下标形式访问指针,一般都是指针作为函数参数时候,而且你知道实际传递给函数的就是一个数组
在特定上下文中,也就是作为函数的参数,一个数组的声明,可依看做是一个指针。作为函数参数的数组,始终会被编译器改成指向数组的第一个元素的指针。
当把一个数组定义为函数的参数时候,可以选择定义为数组,也可以定义为指针,不管用哪种方法,在函数内部事实上获得的就是一个指针
在其他所有情况,定义和声明必须相匹配。如果定义了一个数组,在其他文件中对它进行声明时候,也必须把他声明为数组。指针也是一样。
4.数组名与数组一个元素, 与作为参数时,被编译器转换为的指针的关系。
#include <stdio.h>
#include <stdlib.h>
void test_char(
char arr[])
{
printf("In test_char()
.\n");
printf("addr of array param = %#x \n", &arr);
printf("content of array param = %#x \n", arr);
printf("addr of (arr[0]) = %#x \n", &arr[0]);
printf("addr of (arr[1]) = %#x \n", &arr[1]);
printf("++arr = %#x \n", ++arr);
}
int main()
{
//int array[100]={1,3,4,5};
char my_char[50]="hello world";
printf("addr of array head %x\n", &my_char);
printf("addr of my_char[0] %x\n", &(my_char[0]));
printf("addr of my_char[1] %x\n", &(my_char[1]));
//test(array);
test_char(my_char);
}
结果:
addr of array head bf8c0dfa
addr of my_char[0] bf8c0dfa
addr of my_char[1] bf8c0dfb
In test_char()
.
addr of array param = 0xbf8c0de0
content of array param = 0xbf8c0dfa
addr of (arr[0]) = 0xbf8c0dfa
addr of (arr[1]) = 0xbf8c0dfb
++arr = 0xbf8c0dfb
结果说明:
数组名的地址与数组第一个元素的地址是相同的。
因此数组名不是第一个元素的指针,而是第一个元素,除了它不能直接取出第一个元素。
在test_char 函数中。
参数的地址与数组第一个元素的地址不同,而参数的内容是第一个元素的地址。说明编译器确实用指针实现了数组的访问。指针++后,指向数组下一个元素。