指针解析(二)(原)

    内容接上一篇,以下是答案吐舌笑脸

    1. &ch 代表什么?

    答:变量ch的地址

    2. pch 代表什么?

    答:pch是char类型指针,指向ch。

    3. &pch 代表什么?

    答:指针变量的地址

    4. *pch 代表什么?

    答:对指针变量pch进行解引用,间接访问了ch的值。

    5. *pch + 1 代表什么?

    答:间接访问操作,取得的拷贝值加一,(*pch + 1)为‘b’。

    6. *(pch + 1)代表什么?

    答:访问到了ch之后的下一个地址上的内容。

    7. ++pch 代表什么?

    答:假设当为右值,那么应该是先递增,后传地址。

    8. *++pch 代表什么?

    答:假设当为右值,那么应该是先递增,后通过地址间接访问。

    9. *pch++ 代表什么?

    答:假设当为右值,那么应该是先通过地址间接访问,后递增。

    10. ++*pch 代表什么?

    答:对pch指向的值加一。可以看成这样,++(*pch)。

    11. (*pch)++ 代表什么?

    答:假设为右值,先将pch指向的值传给左值,然后对拷贝回来的值进行递增。

    12. ++*++pch 代表什么?

     答: ++(*++pch)这样的话就可以看的比较的清楚了。

    13. ++*pch++ 代表什么?

     答: ++(*pch++)参考第九个问题即可。

    现在,该是将数据和指针的渊源的时候了忍者。先看以下代码:

int a[10];    // 定义了一个长度为10,int类型的数组
int *pa;      // 定义了一个int类型的指针
pa = a; or pa = &a[0];

    上面的代码说明了这么几个事情:

    ① 数组名代表了本数组第一个元素的地址。

    ② 这个事情要用图来表示:

d3e711e1d6c63b2018f9e00855d3f17d

    以上这些小内容只是开胃菜,真正的大餐在后面会慢慢上来!!吐舌笑脸

1. 字符指针

    字符串常量是一个字符数组。如:”I Love You!“,字符数组以“\0“结尾。此时,数组表示字符串常量和字符指针表示就有极大的区别了:

char amessage[] = "I Love You!";    // 定义了一个数组
char *pmessage = "I Love You!";    // 定义了一个字符指针

它们的区别为:

841577b841bece553461d0d41c72ca9a

    这个图看起来也好像没有什么比较大的区别,无非就是pmessage多了个箭头。其实它们差别大了去了。amessage始终指向同一个储存位置,可以修改字符串常量中的字母。而pmessage只是一个char类型的指针,其初值指向字符串的一个常量,如果你试图修改字符串的内容时,结果就是没有定义破碎的心

2. 指针的运算

    当指针和一个整型量执行算术运算时,整数在执行加法运算前始终会调整合适的大小进行调整。

①. 算术运算

    指针 ± 整数

    这个对于数组和用malloc函数分配的内存都适用。太阳例如以下代码:

#include <iostream>
 
int main()
{
    int values[5];
    int *vp;
    for(vp = values; vp != &values[5];)
    {
        *vp++ = 0;        // 指针在这里执行了递增和赋值
    }
    
    for(vp = values; vp != &values[5];)
    {
        std::cout << *vp++ << std::endl;
    }
 
    return 0;
    
}

    指针 -指针

    这个只有当两个指针都指向了同一个数组之后,这种减法才有实质的意义。太阳例如以下的代码:

#include <iostream>
 
int main()
{
    int values[5];
    int *vp;
    int *vp1;
    int *vp2;
 
    for(vp = values; vp < &values[5];)
    {
        *vp = 0;
        vp++;
    }
    
    vp1 = values;
    vp2 = &values[3];
    std::cout << (vp1 - vp2) << std::endl;    // 显示为-3,ptr_diff类型
 
    return 0;
    
}

3. 指针数组,数组指针,多维数组

    何为指针数组?传说中,数组元素全为指针的数组称为指针数组。一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。例如吐舌笑脸

char *ptr_array[10];    // 指针数组,含有10个char类型指针的数组
                          // *ptr_array[i]:指向第i个文本行的首字符

大概就是这样子了:

334cfdea65715ab29225b5d68a6a60fa
    那么指针数组和数组指针有什么区别呢?太阳数组指针是指向数组首元素的地址的指针,其本质为指针;指针数组是数组元素为指针的数组,其本质为数组。两者之间的区别就亮了吧。

    关于多维数组和指针数组:多维数组,以二维数组为例。

char ar[3][8] = {"we","are","chinese"};
char *parray[3] = {"we","are","chinese"};

大概也是这个样子:

fe7d5d6d8e0fa3249be38c5bb7307892

    很显而易见,多维数组和指针数组有着较大的区别恶魔。对于二维数组而言:只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过制定下标对其元素进行修改.

    对于指针数组而言:如char *parray[3]系统至少会分配3连续的空间用来存储3元素,表示parray是一个3个元素的数组,每个元素是一个指向字符型数据的一个指针。

    在编译器中,ar[3][8]被看成,*(*(ar + i) + j);将其看成指针形式。

4. 总结一下数组和指针的区别与联系太阳

区别:

指针 数组
间接访问数据 直接访问数据
保存地址 保存数据
动态的数据结构 存固定数目且相同类型的元素
malloc(), free() 隐式分配机制
指向匿名数据 自身即数据

联系:

1. 表达式中数组名被编译器当做一个指向该数组的第一个元素的指针
2. 下标总是与指针的偏移量一致
3. 在函数参数中,数组名被编译器当做指向该数组的第一个元素的指针
4. 在多维数组中,虽然与多级指针有着不同,但是在编译器中,还是被看成多级指针的形式。
 

    就说到这里吧!这一篇写了好长的时间,写的不好,请各位大牛指正。多谢了!尴尬

参考文献

1. 《C语言程序设计》

2. 《C和指针》

3. 《C专家编程》

4. http://baike.baidu.com/view/2072881.htm;百度百科中的指针数组的部分知识。

posted @ 2012-02-27 13:29  云端小飞象cg  阅读(1535)  评论(11编辑  收藏  举报