一、几个知识点
- 内存四区:栈、全局(静态),常量区,除此以外剩余的空间暂时不能随意使用;除此以外剩余的空间只要通过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;}
}