chenglong7997

chapter 9(再论数组)

知识点:

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 函数中。参数的地址与数组第一个元素的地址不同,而参数的内容是第一个元素的地址。说明编译器确实用指针实现了数组的访问。指针++后,指向数组下一个元素。





posted on 2012-06-23 02:59 Snape 阅读(143) 评论(0)  编辑 收藏 引用 所属分类: Expert_C_programming


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2012年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

my

搜索

最新评论

阅读排行榜

评论排行榜