Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229568
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 407
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-27 13:42
文章分类

全部博文(41)

文章存档

2016年(1)

2015年(18)

2014年(22)

我的朋友

分类: C/C++

2015-02-27 15:54:14

== 数组 == 
    保存数据,数组名a代表的是数组首元素的首地址而不是数组的首地址。&a才是整个数组的首地址。a本身的地址由编译器另外存入。
    直接访问数据,数据名a是整个数组的名字,数组内每个元素并没有名字。只能通过“具名 + 匿名”的方式来访问其某个元素,不能把数组当一个整体来进行读写操作。数组可以以指针的形式访问*(a + i);也可以以下标的形式访问a[i]。但本质都是a所代表的数组首元素的首地址加上i * sizeof(类型)个byte作为数据的真正地址。

== 指针 == 
    保存数据的地址,任何存入指针变量p的数据都会被当作地址来处理。p本身的地址由编译器另外存储,存储在哪里,并不知道。
    间接访问数据,首先取得指针变量p的内容,把它作为地址,然后从这个地址提取数据或向这个地址写入数据。指针可以以指针的形式访问*(p + 1); 也可以以下标的形式访问p[i]。但其本质都是先取p的内容然后加上i * sizeof(类型)个byte作为数据的真正地址。
    通常用于动态数据结构。
    相关的函数为malloc和free。

== 数组求地址 ==
    int a[10]; // a表示数组的首元素地址
    那么&a表示什么呢,表示数组a的地址,如果对&a执行 + 1操作,将会后移10 * sizeof(a)
== 指针与数组的定义与声明 ==
    -- 定义为数组,声明为指针
        extern char a[]与extern char a[100]等价,因为这只是声明,不分配空间,所以编译器无须知道这个数组有多少个元素。
        对于文件1中定义 char a[100],文件2中声明 extern char *a; 大多数编译器是按文件分别编译的,编译器只按照文件中声明的类型来处理,所以a实际大小为100个byte,但是在文件2中,编译器认为a只占4个byte。这样当在文件2中使用a时就会出问题,它会把a数组前4个字节的数据当成地址给文件2中的a来使用。

    -- 定义为指针,声明为数组
        文件1中定义 char *p = "abcdefg";  文件2中 extern char p[]; 文件1中编译对器分配4个byte空间,并命名为p。同时p里保存了字符串常量“abcdefg”的首字符的首地址。这个字符串常量本身保存在内存的静态区,其内容不可更改。在文件2中,编译器认为p是一个数组,其大小是4个byte,数组内保存的是char类型的数据。

--------------------------------------------------------------------------------------
== 指针数组与数组指针 == 
    指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。    
    数组指针:首先它是一个指针,它指向一个数组,在32位系统下永远是占4个字节。至于它指向的数组占多少字节,不知道。
    例子:
    char a[5] = {'a', 'b', 'c', 'd'};
    char (*p3)[2] = &a;
    char (*p4)[5] = a;
    注解:此时p3与p4的地址是一样,这是因为&a和a的值是一样,但是表示的意义是不一样的。p3 p4也是同样的,这儿就相当于声明了长度为2 和 5的两个数组,p3 p4代表的就是&a,如果对p3和p4 分别 + 1,实际的操作也是不一样的,分别加了 2 * sizeof(char) 和 5 * sizeof (char);
    
    例子:
    int b[4] = {1, 2, 3, 4};
    int c = b;
    int d = (int)b + 1;
    int *ptr2 = (int *)d;
    printf("%x, %d, %x, %x\n", b, *b, ptr2, *ptr2);
    注解:结果跟系统有关,如果是大端存储(即高位存储在低地址,访问是从低地址开始访问)如果是小端存储(即低位存储在低地址,访问是从低地址开始访问),如果是大端存储,内存是(低地址) 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 4(高地址),那么ptr2指向第三个0地址,*ptr2为 0x100; 如果是小端存储,内存是(高地址) 1 0 0 0 0 0 0 02 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0(低地址), 那么ptr2指向第二个0地址,*ptr2为 0x2000000(注意,要从高地址开始计算)
-------------------------------------------------------------------

    -- 无法把指针变量本身传递给一个函数
        因为此时会发生拷贝,函数得到永远是一个拷贝。除非使用二级指针,而此时意义已经不一样。





















阅读(2694) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~