zoukankan      html  css  js  c++  java
  • 【C】二级指针探秘 & 星号的两种用法(1.与基本类型结合形成另一种类型,比如与int结合形成int* 2.取值操作)

    1)问题:二级指针到底是什么?怎么用的?怎么存放的?

     1 #include <stdio.h>
     2 
     3 #define TEST_ADDR 0x12FF40
     4 
     5 void main()
     6 {
     7     int a = 0x5555AAAA;
     8     int* pA = &a;
     9     int** ppA = NULL;
    10     unsigned int * pAddr = (unsigned int *)TEST_ADDR;
    11     ppA = &pA;
    12     printf("0x%p
    ",a);
    13     printf("0x%p, 0x%p
    ",&a, pA);
    14     printf("0x%p, 0x%p
    ",&pA, ppA);
    15     printf("0x%p
    ",&ppA);
    16     
    17     printf("[0x%p]:0x%p 0x%p 0x%p 0x%p
    ",TEST_ADDR, *(pAddr), *(pAddr+1), *(pAddr+2), *(pAddr+3));
    18     pAddr = (unsigned int *)(TEST_ADDR+0x10);
    19     printf("[0x%p]:0x%p 0x%p 0x%p 0x%p
    ",TEST_ADDR+0x10, *(pAddr), *(pAddr+1), *(pAddr+2), *(pAddr+3));
    20     pAddr = (unsigned int *)(TEST_ADDR+0x20);
    21     printf("[0x%p]:0x%p 0x%p 0x%p 0x%p
    ",TEST_ADDR+0x20, *(pAddr), *(pAddr+1), *(pAddr+2), *(pAddr+3));
    22 }

    结果如下:

    0x5555AAAA
    0x0012FF60, 0x0012FF60
    0x0012FF54, 0x0012FF54
    0x0012FF48
    [0x0012FF40]:0xCCCCCCCC 0xCCCCCCCC 0x0012FF54 0xCCCCCCCC
    [0x0012FF50]:0xCCCCCCCC 0x0012FF60 0xCCCCCCCC 0xCCCCCCCC
    [0x0012FF60]:0x5555AAAA 0xCCCCCCCC 0x0012FFB8 0x00411B36
    请按任意键继续. . .

    结果怎么看:

      0x0012FF48存放的值是0x0012FF54       ->     ppA = &pA;

      0x0012FF54存放的值是0x0012FF60    ->     pA = &a;

      0x0012FF60存放的值是0x5555AAAA      ->     int a = 0x5555AAAA;

    分析:

    a.二级指针的用法:正确用法ppA = &pA;    (若用*ppA = pA; 编译无错,运行出错)

             记忆:ppA = &pA这是在搞定指向;而*ppA只 用于取值/赋值    

            (这种用法也是错的int** ppA = &&a;)

            (这种用法也是错的int** ppA = pA;)

    b.另一种正确用法:

      int** ppA = &pA;

      这种用法类比于pA = &a,只不过此时pA指向的是一个int,而ppA指向的是一个指针;此时的**可以理解为与int结合跟精密,是一种类型的一部分,因为ppA的类型为int**

    c.二级指针是指向指针的指针;(这句只含一层意思:二级指针也是指针,没什么特殊的,要用得先指向,再取值/赋值)

    总结:

      形成习惯:定义二级指针的时候先赋值NULL;如果要用,先指向,再进行取值赋值操作;

    2)实例——高级些的hello word!

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 #define STR            "Hello!
    "
     6 #define STR_MAX        10
     7 
     8 extern int mallocStr(char** pStr, unsigned int len);
     9 extern int test(char* pStr);
    10 extern void freeStr(char* pStr);
    11 
    12 int main()
    13 {
    14     char* pStr = NULL;
    15 
    16     if(0 != mallocStr(&pStr, STR_MAX))
    17     {
    18         return -1;
    19     }
    20     memset(pStr, 0 , STR_MAX);
    21     test(pStr);
    22     freeStr(pStr);
    23     return 0;
    24 }
    25 
    26 int mallocStr(char** ppStr, unsigned int len)
    27 {
    28     char* pMem = NULL;
    29     pMem = (char*)malloc(len);
    30     if (NULL == pMem)
    31     {
    32         return -1;
    33     }
    34 
    35     *ppStr = pMem;
    36     return 0;
    37 }
    38 
    39 int test(char* pStr)
    40 {
    41     strncpy(pStr, STR, STR_MAX);
    42 
    43     printf("%s", pStr);
    44     return 0;
    45 }
    46 
    47 void freeStr(char* pStr)
    48 {
    49     free(pStr);
    50     pStr = NULL;
    51 }

    点评:

      i.在第14行不建议使用二级指针,因为二级指针需要一级指针作媒介来指向实际内存;若此处使用二级指针,此题几乎无解;

      ii.二级指针通常是作返回值用,通常用法是:调用函数定义一级指针,接着用&p调用操作函数,而在操作函数中用二级指针进行操作;

  • 相关阅读:
    Go基础系列:流程控制结构
    Go基础系列:数据类型转换(strconv包)
    Go基础系列:简单数据类型
    Go基础系列:常量和变量
    Go基础系列:map类型
    Go基础系列:Go slice详解
    go基础系列:数组
    Go基础系列:import导包和初始化阶段
    Go基础系列:构建go程序
    go基础系列:结构struct
  • 原文地址:https://www.cnblogs.com/caixu/p/3451778.html
Copyright © 2011-2022 走看看