C语言指针实例详解

#include <stdio.h>

//*a是指针变量  a就代表存储地址
void test1(int *a) {
    *a = 2;
    return;
}

* test2(int *a) {
    *a = 323;
    return a;
}
int main()
{
    
    printf("------------------------地址--------------------------\n");
    int var1;
    int var2[10];
    printf("var1变量的地址: %p\n", &var1);
    printf("var2变量的地址: %p\n", &var2);


    printf("------------------------指针与地址--------------------------\n");
    int var = 20; /*实际变量的声明*/
    int *ip;  /*指针变量的声明*/
    /*

        int var = 20;
        int ip;
        var 等价于 ip
        &ip  等价于 &var
        &ip 就相当于存储地址


        int var = 20; 
        int *ip;  
        var 等价于 *ip  *ip 相当于一种特殊的变量名  而ip就相当于 省略了& 的存储地址
        ip  等价于 &var
        ip 就相当于存储地址
        
    */
    ip = &var;//指向地址
    printf("var 变量的地址:%p\n", &var);
    printf("在指针变量中存储的地址 %p\n", ip);
    printf("使用指针访问值 %d\n", *ip);
    printf("--------------------------------------------------\n");
    int *ptr = NULL;
    printf("ptr 的地址是 %p\n", ptr);
    printf("--------------------------------------------------\n");


    int  var12[] = { 10, 100, 200 };
    int  i, *ptr1;

    /* 
    指针中的数组地址  var12 默认 第一块地址    
    */
    ptr1 = var12;
    printf("var12 等于 &var12[i] 第一块地址是 %p\n", var12);
    printf("&var12[1] 指定第二块地址是 %p\n", &var12[1]);
    for (i = 0; i < 3; i++)
    {

        printf("存储地址:var12[%d] = %p\n", i, ptr1);
        printf("存储值:var12[%d] = %d\n", i, *ptr1);

        /* 移动到下一个位置 32位 c int 类型是 4个字节  所以地址是以 四个累加输出 */
        ptr1++;
    }

    printf("-----------------指针数组和数组指针---------------------------------\n");
    printf("-----------数组指针-----------\n");

    /* 数组指针 */
    int a[2][2] = { {1,2},{13,14} };
    int(*b)[2];
    b = a;
    //b = &a[0][0];
    //指向地址
    //b[0] 相当于 第一行数组的地址  
    printf("b存储值:(指向地址)= %p,%p\n",  b[0], (b[0] + 1));
    printf("a存储值:(指向地址)= %p,%p\n", a[0], (a[0] + 1));

    //b[1] 相当于 第二行数组的地址  地址加一 依次输出地址
    printf("存储值:(指向地址)= %p,%p\n", b[1], (b[1]+1));

    //b[0] 相当于 第一行数组的地址  b[0][0] 相当于 第一行数组的第一个值
    printf("存储值:(输出第一行数组的地址的值)= %d,%d\n", b[0][0], b[0][1]);
    //因为前面加了地址符所以输出的是 第一行数组的 各个地址
    printf("存储值:(输出第一行数组每个的地址)= %p,%p\n", &b[0][0], &b[0][1]);


    //指向数组的 指针数组  *b[0] 指向第一个数组  默认的是第一个数
    printf("存储值:(指向数组的值)= %d,%d\n", *b[0], (*b[0]+1));
    printf("存储值:(指向数组的值)= %d,%d\n", *b[1], (*b[1]+1));


    printf("-----------指针数组-----------\n");
    /* 指针数组 */
    int c[2][2] = { {5,6},{17,18} };
    int *d[2];
    *d = c;//
    //*d(这代表 整个数组 的地址) *d[0] 代表地址的第一个值  *d[0](默认的) 
    printf("d存储值:(默认输出第一个地址的第一个值)= %d\n", *d[0]);
    printf("&[0][0]正经的第一个地址:(指向数组的地址)= %p\n", &d[0][0]);
    printf("d[0]默认的第一个地址:(指向数组的地址)= %p\n", d[0]);
    printf("*d默认的第一个地址:(指向数组的地址)= %p\n", *d);
    printf("-----------拓展-----------\n");
    printf("*(*d+1)输出地址的值:(指向数组的值)= %d\n", *(*d+1));
    printf("*(&d[0][0])输出地址的值:(指向数组的值)= %d\n", *(&d[0][0]));
    printf("&(*(*d + 1))指向数组的地址:(指向数组的地址)= %p\n", &(*(*d + 1)));
    printf("d野指针:(指向数组的地址)= %p\n", d);
    printf("-----------函数指针-----------\n");
    int h = 3;
    printf("h未调用之前 %d,地址 %p\n", h, &h);
    test1(&h);
    printf("h调用之后 %d,地址 %p\n", h, &h);
    printf("-----------函数返回指针-----------\n");
    int *u =2321;//指向常量
    printf("u未调用之前 %d \n", u);
    //printf("*u未调用之前 %d\n", *u); --- 报错
    printf("&u未调用之前的地址 %p\n", &u); 
    int *u1;
    u1 = &u;//指向地址
    printf("*u1未调用之前的值 %d\n", *u1);
    printf("u1未调用之前的地址 %p\n", u1);


    //printf("u1未调用之前 %d \n", u1);
    //printf("*u未调用之前 %d\n", *u);
    //printf("*u1未调用之前 %p\n", *(&u1));

    u = test2(&h);
    printf("*u调用之后 %d,地址 %p\n", *u, u);
    system("pause");
    return 0; 
    
}


/*
备注
32位编译器

char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int:  4个字节
unsigned int : 4个字节
float:  4个字节
double:   8个字节
long:   4个字节
long long:  8个字节
unsigned long:  4个字节


64位编译器

char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int:  4个字节
unsigned int : 4个字节
float:  4个字节
double:   8个字节
long:   8个字节
long long:  8个字节
unsigned long:  8个字节
*/

猜你喜欢

转载自blog.csdn.net/qq_28400257/article/details/84376082