首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c-指针数组、二级指针、数组指针

二级指针,是指向另一个指向目标值的指针,也就是指向指针指针。这个概念也叫做“多级间址”,或“多级间接地址(multiple indirection)”。普通指针的值是含预期值变量的地址。...二级指针中,第一个指针含第二个指针的地址,第二个指针再指向含预期值的变量。 间接寻址的级数不受限制,但极少需要二级以上的间址。实际上,过深的间址难以理解,容易引起概念错误。...作为指向指针指针变量,必须这样声明,即通过在变量名的前面放置两个星号(**)来实现。 间接寻址的级数不受限制,但极少需要二级以上的间址。实际上,过深的间址难以理解,容易引起概念错误。...为了通过二级指针间接访问到目标值,必须使用双星号。如上所示。 ?...,即二级指针 //给指针数组p赋值,让指针数组的每个元素都指向数组a中元素的内存地址 for(i=0;i<5;i++) p[i]=&a[i];

85430
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C语言】指针&&二级指针&&数组指针&&指针数组详解

    1.初始指针 1.1 什么是指针指针是什么?...指针理解的2个要点: 指针是内存中一个最小单元的编号,也就是地址 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量 int* p;//创建一个指针,指的就是指针变量 总结:指针就是地址...,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较 可以从前往后遍历,但是不要从后往前遍历 1.6 二级指针 指针变量也是变量,是变量就有地址 二级指针变量存放一级指针变量的地址 同理,也有三级指针变量...,存放二级指针变量的地址 a的地址存放在p中,p的地址存放在pp中 p是一级指针,pp是二级指针 *pp通过对pp中的地址进行解引用,这样找到的是p,*pp访问的其实就是p **pp先通过*pp找到p,...p,传给函数 print(p, sz); return 0; } 3.2.4 二级指针传参 #include void test(int** ptr) { printf("num

    59110

    二级指针指针数组关系

    指针数组我们一般用来存放一组字符串,来进行比较或储存的作用,而操作指针数组可以通过两种方式,一种则是直接使用下标方式,而另外一种,则可以通过二级指针。..., char *argv[]) { char* pArray[] = { “apple”, “nokia”, “google”, “samsung”, “huawei”, NULL }; // 通常把指针数组的最后一个元素设置为...NULL // 这样就可以通过while循环直接遍历指针数组 // 而不需要知道指针数组内部元素的长度 char** p = pArray; // 指针数组可以直接赋值给二级指针 // pArray是指向一个指针数组首元素的...char*类型的指针 // 对一个 char*类型的指针再引用就是char**类型 // 通过二级指针遍历指针数组中的内容 int i = 0; while (*p) { // 两种方法一致 printf

    11910

    C二级指针

    如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针指针。...C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*。p1 是一级指针,指向普通类型的数据,定义时有一个*;p2 是二级指针,指向一级指针 p1,定义时有两个*。...如果我们希望再定义一个三级指针 p3,让它指向 p2,那么可以这样写: int ***p3 = &p2; 四级指针也是类似的道理: int ****p4 = &p3; 实际开发中会经常使用一级指针二级指针...,几乎用不到高级指针。...想要获取指针指向的数据时,一级指针加一个*,二级指针加两个*,三级指针加三个*,以此类推,请看代码: #include int main(){ int a =100; int

    52510

    【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针 排序 | 通过 交换指针方式 进行排序 )

    文章目录 一、二维指针 排序 ( 通过 交换指针方式 进行排序 ) 二、完整代码示例 一、二维指针 排序 ( 通过 交换指针方式 进行排序 ) ---- 在上一篇博客 【C 语言】二级指针作为输入 (...二维指针 | 为 二维指针 分配内存 - 存放 一维指针 | 为每个 一维指针 分配内存 | 释放二维指针内存 ) 基础上 , 对 二维指针 指向的 若干 一维指针 指向的数据 进行排序 ; 首先 ,..., 该指针是存储 要 交换指针 的临时变量 ; // 排序时 , 交换指针 , 该指针是存储 要 交换指针 的临时变量 char *tmp = NULL; 然后 , 对二维指针指向的数据..., 进行排序 ; 涉及到使用 strcmp 函数 , 参考 【C 语言】二级指针作为输入 ( 指针数组 | 指针数组排序 | 字符串排序 | strcmp 函数 ) 一、strcmp 函数 博客章节...= NULL) { free(p[i]); p[i] = NULL; } } // 再释放 二级指针

    36810

    【C 语言】二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )

    文章目录 一、二级指针 二、完整代码示例 一、二级指针 ---- 指针 作为 函数输入 : 调用者 负责 分配内存 ; 指针 作为 函数输出 : 函数 负责 分配内存 , 一般 传入二级指针 , 函数负责生成内存..., 并 使用 二级指针 指向 一级指针, 一级指针 指向 在 函数中 分配好内存 ; 如果要在 函数中 分配内存 , 则 需要 传入二级指针 , 在函数内部调用 malloc 函数 , 分配内存 ,...间接赋值 给 一级指针 *str2 = s2; return 0; } 二级指针 最终 指向的内存释放 : 释放二级指针 指向的 一级指针 指向的内存的地址 , 释放后 将指针指向的地址置空...return -1; } // 释放二级指针 指向的 一级指针 指向的内存的地址 // 释放指针 free(*str); // 将指针指向的地址置空...一级指针 , 只能释放一级指针指向的内存 * 不能 讲一级指针 置空 */ int free_str2(char *str) { // 判断传入的二级指针是否合法 if(str =

    74110

    一级指针二级指针指针和数组、指针数组总结

    #一级指针二级指针指针和数组、指针数组总结 ##数组:C 语言中所有的数组都可以看成是一维数组,数组传参的时候会发生降维问题,任何数组传参都会降维成指针。...##指针指针存放变量的地址,指向的值是变量的内容。 指针(一级指针二级指针、多级指针): 一级指针用普通变量的地址去接,二级指针用一级指针的地址去接,N级指针用N-1级指针的地址去接。...我们在一个程序中已经使用了一级指针了,如果想修改这个一级指针或者这个一级指针指向的内容,就会使用到二级指针了,但是,为了代码的可读性,最好用二级以下的指针解决。...char** pp = &p;//pp是二级 printf("%c ",*p); printf("%c ",**pp); return 0; } 输出的结果为:w w //指针指向数组: int...数组指针只是一个指针变量,它占有内存中一个指针的存储空间。 指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

    1.7K20

    【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )

    文章目录 一、二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 ) 二、完整代码示例 一、二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 ) ---- 在上一篇博客 【C...语言】二级指针作为输入 ( 二维指针 | 为 二维指针 分配内存 - 存放 一维指针 | 为每个 一维指针 分配内存 | 释放二维指针内存 ) 基础上 , 对 二维指针 指向的 若干 一维指针 指向的数据..., 对二维指针指向的数据 , 进行排序 ; 涉及到使用 strcmp 函数 , 参考 【C 语言】二级指针作为输入 ( 指针数组 | 指针数组排序 | 字符串排序 | strcmp 函数 ) 一、strcmp...; // 排序时 , 交换指针 , 该指针是存储 要 交换指针 的临时变量 //char *tmp = NULL; // 排序时 , 交换指针指向的内存数据 // 该数组是存储...= NULL) { free(p[i]); p[i] = NULL; } } // 再释放 二级指针

    51810

    【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 抽象业务逻辑函数 )

    文章目录 一、二级指针排序 ( 抽象业务逻辑函数 ) 1、生成 二级指针 函数 2、打印 二维指针 函数 3、二维指针排序 函数 4、释放 二维指针 函数 二、完整代码示例 一、二级指针排序 ( 抽象业务逻辑函数...) ---- 1、生成 二级指针 函数 首先 , 为 一维指针变量 分配内存 ; 在堆内存中 , 分配一块内存空间 , 用于存储 num 个 一维指针 , 每个 一维指针 指向一块内存空间 ;...*) * num ); 然后 , 为每个 一维指针 在堆内存中 分配 20 字节内存 , 并为其赋值 ; // 遍历 二维指针 指向的多个 一维指针 // 并为每个 一维指针 在堆内存中...= NULL) { free(p[i]); p[i] = NULL; } } // 再释放 二级指针...= NULL) { free(p[i]); p[i] = NULL; } } // 再释放 二级指针

    28010

    【C 语言】二级指针作为输入 ( 指针数组 | 复杂指针解读 )

    文章目录 一、指针数组 二、复杂指针解读 三、数组指针代码示例 一、指针数组 ---- 定义一个数组指针 : 数组中的 元素 是 指向 字符串的指针 , 即 每个数组元素 只有 4 字节 ; char...--- 复杂指针阅读参考 【C 语言】指针数据类型 ( 指针步长 | 复杂指针阅读技巧 ) 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 |...数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)3....解读 复杂的 指针声明 ( 难点 重点 | ①找出中心标识符 ②先右 后左 看 确定类型 提取 ③ 继续分析 左右看 … ) 博客 , 阅读复杂指针 ; 上述指针数组解析流程 : ① 中心标识符是 array...数组元素 是 指针 */ char *array[] = {"abc", "123", "258", "sfd"}; 这是 指针数组 , 数组元素 是 指针 三、数组指针代码示例 --

    45420

    C语言的二级指针

    用C语言指针作为函数返回值: C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数 函数运行结束后会销毁在它内部定义的所有局部数据 #include #include...taoaaaaaaa"; char *c; c=strlong(a,b); printf("c=%s",c); return 0; } C语言二级指针...(指向指针指针): 指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。...如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针指针 #include int main(){ int e=100; int *...0xbfe7c530 ,正好b指向e b指针变量本身的地址是0xbfe7c534 , c是指针地址是0xbfe7c534 ,整好c指向b

    1K40

    【C 语言】二级指针作为输入 ( 指针数组 | 将 二级指针 作为函数输入 | 抽象函数业务逻辑 )

    文章目录 一、打印 指针数组 中指针指向的字符串 二、字符串排序 三、代码示例 一、打印 指针数组 中指针指向的字符串 ---- 打印 指针数组 中指针指向的字符串 : 指针退化问题 : 传入二级指针..., 同时还要传入 一级指针的个数 ; 实参是 指针数组 , 形参 退化为 二级指针 , 需要人为指定 数组的元素个数 ; 验证指针合法性 : 函数中 , 只要是指针 , 就有可能为 NULL , 函数入口就要验证该指针合法性...作为参数 , 传入函数中 ; 函数的 二级指针 形参 , 既要作为 输入 , 又要作为输出 ; int sort_array(char **array, int num) { // 验证指针合法性...char *tmp; // 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比 for(i = 0; i < num; i++) { for...char *tmp; // 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比 for(i = 0; i < num; i++) { for

    58010

    【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

    文章目录 一、二级指针 1、为 二维指针 分配内存 2、为每个 一维指针 分配内存 3、释放 二维指针 内存 二、完整代码示例 一、二级指针 ---- 声明二级指针 : // 声明二维指针...指向的多个 一维指针变量 ; 通过遍历 , 向 每个 一维指针 变量 指向的内存空间中 , // 遍历 二维指针 指向的多个 一维指针 // 并为每个 一维指针 在堆内存中 分配 20...= NULL) { free(p[i]); p[i] = NULL; } } 然后再释放 , 二级指针 指向的 内存..., 这些内存中存储这 一级指针 数据 ; // 再释放 二级指针 if(p !...= NULL) { free(p[i]); p[i] = NULL; } } // 再释放 二级指针

    1.4K10

    【C 语言】二级指针案例 ( 多级指针内存释放问题 | 多级指针避免野指针 )

    释放 二级指针 内存 * @param p 三级指针 指向 二级指针内存, 目的是为了将 二级指针 置空 * @param count 二级指针 指向的 一级指针 个数 */ void free_memory...// 接收 str 三级指针 指向的 二级指针 p = *str; // 验证 指针 合法性 if (p == NULL) { return ;...} // 先释放 二级指针 指向的 一级指针 内存 for (i=0; i < count; i++) { // 如果 一级指针 不为空才释放...内存 * @param p 三级指针 指向 二级指针内存, 目的是为了将 二级指针 置空 * @param count 二级指针 指向的 一级指针 个数 */ void free_memory(...// 接收 str 三级指针 指向的 二级指针 p = *str; // 验证 指针 合法性 if (p == NULL) { return ;

    2.2K20

    【C 语言】二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )

    文章目录 前言 一、指针数组 二、二维数组 三、自定义二维指针内存 前言 绘制如下 3 种二级指针的内存模型 : // I....指针数组 char *p1 []= {"12", "ab", "34"}; // II. 二维数组 char p2[3][4] = {"12", "ab", "34"}; // III....指针数组 char *p1[] = {"12", "ab", "34"}; 指针数组 内存结构图 : 在 栈内存 中 , 是一个 指针数组 , 数组中有 3 个元素 , 都是指针数据类型 ; 指针...---- 绘制 自定义二维指针内存 的内存模型图 : // III...., 其指向的 一维指针 都在 堆内存中 , 一维指针 也是指向 堆内存 中的数据 ; 注意 指针 指向 的是 内存块的 低地址 , 不要指错了位置 ; 全局区 中的 常量区 中 , 存在初始化的 字符串

    83410

    二级指针、一维数组与指针,二维数组与指针

    二级指针 指针可以指向一个普通类型的数据,例如 int、double、char 等,也可以指向一个指针类型的数据,例如 int *、double *、char * 等。...如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针指针。...C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*。page 是一级指针,指向普通类型的数据,定义时有一个*;ppage 是二级指针,指向一级指针 page,定义时有两个*。...实际开发中会经常使用一级指针二级指针,几乎用不到高级指针。...想要获取指针指向的数据时,一级指针加一个*,二级指针加两个*,三级指针加三个*,以此类推,请看代码: #include int main() { int a =100;

    84820
    领券