一、几个知识点

  • 内存四区:栈、全局(静态),常量区,除此以外剩余的空间暂时不能随意使用;除此以外剩余的空间只要通过malloc函数申请一下,就可以使用了;
  • 申请一个堆上的单个int变量的方法:int* p = (int*)malloc(sizeof(int));
  • 申请一个堆上的int数组的方法:int* p = (int*)malloc(sizeof(int)*5);
  • 堆上的地址可以跨函数使用,在不需要使用时使用 free 函数释放;

二、二级指针

问题引入

char* ss[4] = { "basic","fortran","C++" };//每个元素都是char*类型
对于这样的指针数组,应该用什么样的指针去遍历呢?答案是:二级指针
char** p = ss; // 二级指针变量p,指向一个指针数组

示例1-在栈内和堆上分别定义指针数组

char* ss[] = { "abc","dd","aaa",NULL };
char* *p = (char**)malloc(sizeof(char*) * 4);
int i = 0;
while (i < 4)
{p[i] = ss[i];++i;
}
free(p);

示例2-二级指针遍历指针数组

#include <stdio.h>
void main()
{char* p = "Test";char* ar[4] = { "basic","fortran","C++" }; // 一共4个元素,每个元素都是char*类型printf("sizeof(ar)=%d\n", sizeof(ar));char* *pp = ar;int i = 0;while (i < sizeof(ar) / sizeof(ar[0])){p = pp[i];printf("第%d个指针变量指向的内容是:%s\n", i, p); //pp[i]的类型是char*++i;}printf("p指向的地址是:0x%p内存空间上的内容是:%s\n", p, p);
}

运行结果

示例3

#include<stdio.h>
void main()
{int ar[10] = { 33,55 };int n = 10;int* p = &n; //一级指针变量指向了一个普通变量,为了远程操控普通变量存储的数据int* q = ar;*p = -1;//int* *pp = &p; //指针变量的指针是二级指针//pp = &q;//*pp = p;//*p或p[0]远程操控一个一级指针变量,让它指向到其他地址int* as[10] = { ar,&n,NULL }; // 每个元素都是一个一级指针变量int* *pp = as; // =&as[0]; // as[0]类型是int*类型int i = 0;while (i < sizeof(as) / sizeof(as[0])){printf("第%d条指针指向:0x%p\n", i, pp[i]); //pp[i]类型是int*类型++i;}printf("\n");int ar1[] = { 32,56,93,56,-1,0 }; //每个元素都是int类型int* p1 = &ar1[0]; // ar; // 一级指针变量p, 指向一个普通变量的一维数组while (*p1){printf("p[%d]=%d\n", p1 - ar1, *p1);//指针的减法: 相差字节/sizeof(int),逻辑上是几个int++p1;}
}

C语言实用算法系列之二级指针用法简介相关推荐

  1. C语言实用算法系列之行指针

    代码 #include <stdio.h>void Test(double (*a)[3]) {printf("sizeof(a)=%d\n", sizeof(a)); ...

  2. C语言实用算法系列之学生管理系统_单向链表外排序_堆内数组存储链表节点指针_函数指针+switch

    函数指针简介 #include <stdio.h>int add(int a, int b) {return a + b; }int dec(int a, int b)

  3. C语言实用算法系列之学生管理系统_单向链表外排序_堆内数组存储链表节点指针

    代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> #include <st ...

  4. C语言实用算法系列之学生管理系统_单向链表外排序_栈内数组存储链表节点指针

    代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> #include <st ...

  5. 【终极完美高效】C语言实用算法系列之学生管理系统_单向链表外排序_堆内数组存储链表节点指针_函数指针数组

    代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> #include <st ...

  6. 【总结】C语言实用算法系列之知识点梳理_附学生管理系统各模块代码

    1.内存四区特点 a)全局区变量空间缺省每个字节为00,栈空间缺省是cc,堆缺省是cd b)堆.全局区(静态区).字符串常量区,与栈区空间的位置距离很大,栈区访问速度可能最快: 2.C语言与C++编译 ...

  7. C语言实用算法系列之学生管理系统_单向链表内操作_提取排序规则

    代码 后续文章的排序均采用速度较快的选择排序算法. #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <strin ...

  8. C语言实用算法系列之strtok字符串分割、strcat字符串拼接、strcpy、strcmp

    代码 #define _CRT_SECURE_NO_WARNINGS#include <string.h> #include <stdio.h>char string[] = ...

  9. C语言实用算法系列之memcpy、memmove函数原理与实现

    直接看代码 #include<stdio.h> #include<string.h> /*返回指向pDest的指针*/ void* MemCopy(void* pDest, c ...

最新文章

  1. vue渲染大量数据如何优化_Vue - Table表格渲染上千数据优化
  2. 重写Notification有感~~
  3. 实例——在编程过程中进行单元测试
  4. 电脑模拟器哪个好_《英雄聯盟:激鬥峽谷》电脑版哪个安卓模拟器好用?《英雄聯盟:激鬥峽谷》手游电脑版怎么玩...
  5. Winform中实现设置ZedGraph的GraphPane的大小匹配ZedGraphControl
  6. jqgrid本地加载分页_jqgrid无需分页即可加载大数据集
  7. Spring Boot 注解定时任务
  8. Java Platform SE 8 中文文档
  9. Python标准库 - subprocess
  10. C# Windows 服务
  11. c语言中end4,C语言编程,第四题
  12. office密码解锁工具
  13. A1339. JZPLCM(顾昱洲)|树状数组|hash表|逆元|分解质因数
  14. 【Python基础】from pygame.base import * # pylint: disable=wildcard-import; lgtm[py/polluting-import] Mod
  15. 联手华为,北京联通在北京打造不一样的5G慧生活!
  16. android+微博点赞动画,模仿微博点赞动画
  17. Hadoop3+Hive3安装记录(虚拟机搭建分布式环境,报错解决)
  18. win10系统,打开word文档慢慢慢
  19. xmind-8 安装以及 如何激活
  20. asp毕业设计——基于asp+sqlserver的选题管理系统设计与实现(毕业论文+程序源码)——选题管理系统

热门文章

  1. 使用@OrderBy对Spring Data MongoDB集合进行排序
  2. App Engine中的Google Services身份验证,第1部分
  3. 用于Spring应用程序的Gradle原型
  4. 在Intellij IDEA中运行Vaadin应用
  5. 调试生产服务器– Eclipse和JBoss展示
  6. android官方文档中文版_最全实至名归,NumPy 官方早有中文教程,结合深度学习,还有防脱发指南...
  7. Java文件下载/下载文件的案例
  8. IntelliJ IDEA for Mac 封装字段(添加setter/getter方法)
  9. 如何正确认识C语言在当今编程领域的地位
  10. C语言 | 递增运算符