二级指针
二级指针的含义
二级指针的示意如上图所示:变量int a
的内容是255,其地址是0x0000FFFF,int *p
是一个指针,指针存的是a的地址,指针的地址是0XFBC00000;int ** pp
是一个二级指针,指针存的是一个地址,该地址是一级指针p所在的地址。
#include<stdio.h>
#include<stdlib.h>
//为指针变量分配内存
void create(int* *p)
{
//打印分配内存前的指针
printf("create --> p %p\n", *p);
*p = (int *)malloc(sizeof(int)*4);
//打印分配内存后的指针
printf("create --> p %p\n", *p);
}
//释放指针变量
void release(int *p)
{
//释放当前指针
printf("pointer --> p %p \n", p);
free(p);
}
int main(int argc, char const *argv[])
{
//定义一个指针变量空
int *x = NULL;
//为指针变量分配内存
create(&x);
//打印当前指针
printf("create --> x %p \n", x);
//释放指针
release(x);
return 0;
}
总的来说,二级指针还是一个指针,只是二级指针里的内容还是一个指针。类比二维数组和一维数组的关系,方便理解。
动态数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
int * array = NULL;
int array_idx = 0;
int array_len = 1;
void insert_data_to_array(int data)
{
//数组长度不够,需要扩充
if (array_idx >= array_len)
{
int new_len;//保存新的数组长度
new_len = array_len * 2;//数组长度变为原来的两倍
//开辟新的空间用来保存数组
int * new_arr = (int *)malloc(sizeof(int) * new_len);
//将数组中原来的内容拷贝到新的地址中
memcpy(new_arr, array, sizeof(int)*array_len);
//释放原来指针的空间
free(array);
//将数组地址指向新开辟的空间
array = new_arr;
//更新数组长度
array_len = new_len;
}
//将数据填充到数组中
array[array_idx] = data;
//索引值增加
array_idx++;
}
int main(int argc, char const *argv[])
{
//第一次开辟一个空间用来保存
array = (int *)malloc(sizeof(int)*array_len);
for (int i = 0; i < 100; i++)
{
insert_data_to_array(i);
}
for (int i = 0; i < 100; i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
getchar();
free(array);
return 0;
}
}