21 November 2016

例子来源 http://www.cnblogs.com/AndyJee/p/4630153.html
作者:http://home.cnblogs.com/u/AndyJee/

程序 1

#include <stdio.h>

void fun(int *p) {
    int b = 100;
    p = &b;
}

int main()
{
    int a = 10;
    int *q = &a;

    printf("%d\n", *q);         /* 10 */

    fun(q);
    printf("%d\n", *q);         /* 10 */

    return 0;
}

程序 2

#include <stdio.h>

void fun(int *p) {
    int b = 100;
    *p = b;
}

int main()
{
    int a = 10;
    int *q = &a;

    printf("%d\n", *q);         /* 10 */

    fun(q);
    printf("%d\n", a);          /* 100 */
    printf("%d\n", *q);         /* 100 */

    return 0;
}

程序 3

#include <stdio.h>

void fun(int **p) {
    int b = 100;
    *p = &b;
}

int main()
{
    int a = 10;
    int *q = &a;

    printf("%d\n", *q);         /* 10 */

    fun(&q);
    printf("%d\n", *q);         /* 100 */
    printf("%d\n", a);          /* 10 */

    return 0;
}

程序 4

#include <stdio.h>

void fun(int **p) {
    int b = 100;
    **p = b;
}

int main()
{
    int a = 10;
    int *q = &a;

    printf("%d\n", *q);         /* 10 */

    fun(&q);
    printf("%d\n", *q);         /* 100 */
    printf("%d\n", a);          /* 100 */

    return 0;
}

字符串

#include <stdio.h>
#include <stdlib.h>

void myMalloc(char *s){
    s = (char*) malloc (100);
}

int main()
{
    char *p = NULL;

    myMalloc(p);

    if (p == NULL) {
        printf("P is not changed!\n");    /* P is not changed! */
    } else {
        printf("P has been changed!\n");
        free(p);
    }

    return 0;
}
#include <stdio.h>
#include <stdlib.h>

void myMalloc(char **s){
    *s = (char*) malloc (100);
}

int main()
{
    char *p = NULL;

    myMalloc(&p);

    if (p == NULL) {
        printf("P is not changed!\n");
    } else {
        printf("P has been changed!\n");
        free(p);
    }

    return 0;
}

结论

  • 一级指针
    在第一个程序中,我们传递的是一个指针变量,这个变量指向 a,而且是一个值传递。因为我们没有改变到指针的指向,只是改变指针的值。并不会让数据产生变化
    在第二个程序中,我们传递的是一个指针变量,这个变量指向 a,而且还是一个值传递。这时候我们 用 *p 取出指针的指向,并赋值了,因为数值发生了改变
  • 二级指针
    在第三个程序中,我们传递的还是一个指针变量,不过这个变量指向了一个指针 (表示如下)

    p --> *p --> a
    
    经过函数调用之后
    
    p --> *p --> b
    

    在第四个程序中

    p --> *p --> a
    
    经过函数调用之后
    
    p --> *p --> **p = 100   (**p 就是 a),因此 a 发生改变
    

在 C 语言里面并没有所谓的引用传递,一切都是值传递。
但是当你传递了这个变量的地址,然后取出地址里面的数据,再对地址里面的数据进行修改才能修改变数据

另外一篇有意义的文章
http://guimingyue.iteye.com/blog/1841664