文章目录
一、多级指针概念
- 一级指针:指向的普通变量(存储的是一个普通变量的地址)
- 二级指针:指向的一级指针变量(存储的是一级指针的地址)—–>两次解引用
二、一维数组与指针
1.下标法
A. 数组名相当于第一个内存单元的地址(数组的首地址)
B.
int arr[10];
&arr------>int(*)[10]指向整个一维数组的指针,而不是第一个内存单元的地址
C. 注意:
- arr+1是下标为1的元素的地址(arr是数组名)
- &arr+1是指向了数组最后一个元素的下一个位置
2.指针法for(int i=0;i<10;i++)
{
printf("%d",*(arr+i));
}
- *(arr++)不合法———->虽然数组名可以代表首地址,但是他说一个常量
- *parr++= *(parr++)
三、二维数组与指针
int arr[3][4];
int (*parr)[4]=arr;
*parr----->arr[0]----->一维数组,第0行
**parr---->arr[0][0]
二维数组当一维数组遍历
parr[i] [k] ——>* (parr[i]+k)——–>*( *(parr+i)+k)
四、动态内存分配
1.内存四区
2.意义
- 定义数组时必须指定数组的大小,使用动态分配可以在运行时调整大小
- 突破函数内局部变量的作用域限制,函数结束后,不希望变量的内存被释放
3.malloc
malloc:memory allocate —>内存分配
malloc:参数,需要申请的字节数,malloc(cnt*sizeof(int));
申请的空间不会自动初始化
原型:(void*)malloc(size_t_size) 返回的是动态分配的内存空间起始地址
分配的内存,使用结束必须手动释放 free()释放之后就不要再访问这快内存了,有可能会产生问题
4.calloc
原型:
(void*)calloc(count(个数),size_t_size);
自动初始化为0,也要释放
5.realloc
realloc:重新分配内存,重新开辟内存,再把原来的内存拷贝进去,把原来的内存释放掉
realloc(p(个数),sizeof(int));
//如果新的内存比原来的内存大,那么多出来的则是垃圾值
6.防御性编程
判断动态内存申请成功没,失败返回NULL或者使用assert
五、指针数组
1.概念
存放指针的数组
2.动态二维数组
int** parr=calloc(3,sizeof(int*));
assert(parr);
//给每一个指针都申请一个一维数组
for(int i=0;i<3;i++)
{
parr[i]=calloc(4,sizeof(int));//parr[i]为int*类型
assert(parr[i]);
}
//释放
for(int i=0;i<3;i++)
{
free(parr[i]);
}
free(parr);
————————————————
版权声明:本文为CSDN博主「热爱编程的小K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_72157449/article/details/128371169