指针_C

指针的代码

 

// Code file created by C Code Develop

#include "ccd.h"
#include "stdio.h"
#include "stdlib.h"
// #include "waibu.c"
#include "string.h"

int main(int argc, char **argv)
{
    int          i = 10;
    char       c1 = 'A';
    double     d = 100.56;
    
    // 一、变量的地址
    // 输出内存地址的格式控制符是 %p 地址采用十六进制的数字显示
    printf("变量i的地址是:%p\n", &i);
    printf("变量c1的地址是:%p\n", &c1);
    printf("变量d的地址是:%p\n", &d);
    
    //二、指针
    int *ip;   // 一个整形的指针
    char *cp;  // 一个字符型的指针
    double *dp; 
    
    //三、对指针赋值
    // 用整数型指针存放整数型变量的地址
    //用字符型指针存放字符型变量的地址
    //用双精度型指针存放双精度型变量的地址
    //自定义的数据类型指针存放自定义数据类型变量的地址
    
    // 把指针指向具体的内存变量地址,就是指针赋值
    
    int ii = 10;
    char cc = 'A';
    double dd = 100.56;
    
    int *pii = 0;
    char *pcc = 0;
    double *pdd = 0;
    
    pii = ⅈ // 整数型指针 并 指向变量ii;
    
    int sii = 0x149f8c388;
    printf("pii 的值是%p \n", pii );
    
    printf("sii的值是%p \n", sii); 
    printf("的值是\n" ); 
    
    // 四、通过指针操作内存变量
    /* 
    定义并指向变量 内存地址的 指针变量,
    就可以通过指针操作内存变量操作。
    效果与使用变量名相同
    */
    int i4 = 10;
    int *pi4 = 0;  //定义整数型指针并初始化
    pi4 = &i4; // 整数型指针变量pi4.    &是操作符号 取地址
    
    // 通过指针操作内存变量,改变内存变量的值
    *pi4 = 20; // 同i4=20;
    
    /*  指针变量pi4
    pi4 存放的是 i4 的地址
    *pi4 是寻找 i4 存放的的值
    */
    printf("pi4的值是%p\n", pi4);
    printf("*pi4的值是:%d  \n", *pi4);
    printf("&pi4的值是:%d \n", &pi4);
    printf("i4的值是:%d \n", i4);
    // pi4 = pi4 -> i4;
    // printf("%d", *pi4 ); 
    
    
    char c = 'B';
    char *cr = 0;
    cr = &c;
    *cr = 'C';
    printf("c的值是:c% \n", c);
    printf("*cr的值是:c% \n", *cr);
    printf("cr的值是:%p \n", cr);
    printf("&cr的值是:%p \n\n", &cr); 
    
    // 五、函数参数的传递
    int qq = 10;
    printf("位置一:a是一个变量,地址是%p,a的值是%d \n", &qq, qq);
    funcl(&qq);
    printf("位置二:a是一个变量,地址是%p,a的值是%d \n", &qq, qq)    
    
    
    //七、数组的地址
    /*
    数组占用的内存空间是连续的,
    数组名==数组元素的首地址==数组的地址。
    */
    char name[51];
    strcpy(name, "C语言技术网");
    printf("%p\n", name);
    printf("%p\n", &name );
    printf("%p\n", &name[0] );
    
    printf("%s\n", name );
    printf("%s\n", &name );
    for(int j = 0; j < (sizeof(name) /sizeof(name[0])); j++) { 
        printf("%s\n", &name[j] ); }
    
    // 八、地址的运算
    char   ccc[4];   // 字符数组
    int    iii[4];   // 整数数组
    double ddd[4];   // 浮点数组
    memset(ccc, 0, sizeof(ccc));
    char *pccc = ccc;
    
    memset(iii, 0, sizeof(iii));
    memset(ddd, 0, sizeof(ddd));
    // 用地址相加的方式显示数组全部元素的的址w
    printf("%p", ccc );
    printf("%p", pccc + 1);
    // 以下通过数组常量+1访问地址的方法都是错的,只能定义指针变量,来递增访问
    // printf("%p %p %p %p\n", ccc, ccc + 1, ccc + 2, ccc + 3);
    //printf("%s %s\n", name, name + 1);
    // printf("%p %p %p %p\n", iii, iii + 1, iii + 2, iii + 3);
    // printf("%p %p %p %p\n", ddd, ddd + 1, ddd + 2, ddd + 3);
    /*
    第一行输出的每个地址的增量是1,
    第二行的每个地址的增量是4,
    第三行的每个地址的增量是8,为什么会这样?
    因为数组cc是char型,一个存储单元是1个字节,
    数组ii是int型,一个存储单元是4个字节,
    数组ll是long型,一个存储单元是8个字节,
    地址加1指的是下一个存储单元,不是数学意义中的1。
    详见字符串章节。
    */
   
    // 九、指针占用内存情况。
    /*任何类型的指针占用八字节;*/
    printf("sizeof(int *) is %d.\n", sizeof(int *));        
    // 输出:sizeof(int *) is 8
    printf("sizeof(char *) is %d.\n", sizeof(char *));      
    // 输出:sizeof(char *) is 8
    printf("sizeof(double *) is %d.\n", sizeof(double *));  
    // 输出:sizeof(double *) is 8
    
    //十、其他--函数指针、指针的指针
    
    return 0;
}


void funcl(int *p) {
    printf("位置三:p是一个指针 % p,指向的变量值是 % d \n", p, *p);
    *p = 20;
    printf("位置四:p是一个指针 % p,指向的变量值是 % d \n", p, *p);    
}

 

posted @ 2021-09-26 21:34  def_Class  阅读(22)  评论(0编辑  收藏  举报