发布日期:2015-12-30 11:41 来源: 标签: 编程语言 C教程 C语言指针 C语言指针运算
在C语言中指针功能的强大,主要体现在指针变量的间接运算上。下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
1、基本运算
指针变量的基本运算包括赋值、取地址以及取值(间接运算)等运算。
举例,如清单1: 
[cpp] view plaincopy
    #include <stdio.h>    
    int main(void)  
    {  
        int a = 5;  
        int *p = &a; 
        int b = *p;  
        *p = 9; 
        printf("p = %p, &a = %p, &p = %p\n", p, &a, &p);  
        printf("a = %d, b = %d\n", a, b);  
        return 0;  
    }  
例子输出结果: 
[cpp] view plaincopy
    p = 0xbfee8388, &a = 0xbfee8388, &p = 0xbfee8384  
    a = 9, b = 5  
第6行的意思是把整型变量a的地址赋给指针变量p(这时可以说p指向了a),然后使用间接运算符(*),像第8和第9行那样,通过p来间接地使用a。
第5行的语句再平常不过了,其实是有深意的,在大多数编程语言中用同一符号(如变量名a)来表示它的地址和地址中的内容(即值),编译器根据上下文环境来判断它的具体含义。如例子中的第8行的意思是把变量a的值(即整数5)赋给b(在这种情况下a被叫做右值),而第9行的意思是往a的地址(即0xbfee8388)中存储一个整数9(在这种情况下a被叫作左值),所以变量既可作为左值,也可作为右值。
指针变量作为一种变量,当然既可以给它赋值(如例子中把变量a的地址赋给指针变量p),也可以通过取址运算符(&)来取它的地址(如第11行打印出指针变量p的地址值0xbfee8384)。
取值运算的复杂用法,如清单2: 
[cpp] view plaincopy
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h> 
    void func(char **p, int num)  
    {  
        *p = (char *)malloc(num);  
    } 
    int main(void)  
    {  
        char *str = NULL; 
        func(&str, 20);
        strcpy(str, "hello world!"); 
        printf("%s\n", str); 
        free(str);  
        return 0;  
    } 
例子输出结果: 
[cpp] view plaincopy
    hello world!  
在例子中的第14行,通过函数调用把指针变量str的地址赋给二级指针变量p,然后在第7行通过*p来间接地使用str,这时str中的值为所分配的20个字节内存的首地址,接着往这段内存中拷贝字符串,最后打印字符串并释放这段内存。
2、加减和求差
指针变量加1的意义与整型变量加1的意义不同。
举例,如清单3: 
[cpp] view plaincopy
    #include <stdio.h> 
    int main(void)  
    {  
        int a[] = {18, 17, 16, 15, 14, 13, 12, 11};
        int *start = a, *end = &a[7];  
        printf("address start = %p, end = %p\n", start, end); 
        printf("*(start+2) = %d, *(--end) = %d\n",  
            *(start+2), *(--end));  
        printf("(--end) - (start+2) = %d\n", (--end) - (start+2)); 
        return 0;  
    } 
例子输出结果: 
[cpp] view plaincopy
    address start = 0xbfeabab8, end = 0xbfeabad4  
    *(start+2) = 16, *(--end) = 12  
    (--end) - (start+2) = 3 
首先使用指针变量start和end分别指向数组a的第一个元素和最后一个元素,然后从start+2(即0xbfeabac0,通过式子0xbfeabab8+2*sizeof(int)算出)的地址中取得整数16,和--end(即0xbfeabad0,通过式子0xbfeabad4-1*sizeof(int)算出)的地址中取得整数12,从中可知,指针变量加1是加一个数据类型(就是声明指针变量时所使用的数据类型)的大小。
指针变量求差的意义不大,可以得到数组两个元素之间的距离,如例子中元素7和元素3相隔3个元素。
3、比较
指针变量的比较就是比较指针变量值的大小以及是否相等,与其他数据类型的比较类似。
如清单4: 
[cpp] view plaincopy
    #include <stdio.h>  
    #include <stdlib.h>  
    int main(void)  
    {  
        char *p = (char *)malloc(10);  
        if (p == NULL)  
        printf("failed to allocate memory.\n");  
        else  
        printf("allocate memory successfully.\n"); 
        free(p);  
        return 0;  
    } 
例子输出结果:
[cpp] view plaincopy
    allocate memory successfully. 
例子中,若malloc的返回值不为NULL即表示内存分配成功。

相关评论

专题信息
    C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。 C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。