本文主要是介绍16.3指针复习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#define _CTR_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*
* 指针:指针是一种类型,存储的是变量的地址,指针存储谁的地址,咱们就说指针指向谁。
* 一级指针
* 1,指向的是普通变量(不是指针变量,int char double float)
* 2,指针操作运算符:
* 1. & 取地址符 获得变量的地址
* 2. * 取值(解引用) 根据地址获取对应内存空间的值
* 3.& 一把锁 *一把钥匙 一把钥匙开一把锁
* 二级指针
* 1,指向的是一级指针的地址 int *p = NULL;int **pp = &p; pp就是二级指针
* 2,通过二级指针访问的时候,要搞清楚你要访问什么?加一个还是两个*
* 3,动态内存分配
* int* *pp = malloc(5*sizeof(int*));
* 一维数组指针:int arr[3]; 每个元素就是int类型
* int *p = arr;
* char*pc = (char*)arr;
* 二维数组指针:int arr[5][3]; 每个元素是一个一维数组
* int (*p)[3] = arr;
* 函数指针:复制函数原型,然后加括号
*
*
* 动态内存分配:把变量放到堆区,内存需要咱们手动管理(手动申请,手动释放)
* 栈内存是有限的 4k
* 堆内存是无限的 内存条有多大,你就可以申请多大
*
* 什么时候用:
* 1.动态的调整数组的大小的时候
* 2.如果你想通过函数返回一个地址,又不想定义静态变量(动态分配的内存,不会自动释放)
*
* malloc 申请的内存不会自动初始化
* calloc 申请的内存会自动初始化为0
* realloc 对已经动态内存分配的内存进行调整,如果要调整的比原来的打,则扩容(多出来的不会自动初始化),比原来的小则,缩小(超出的数据直接丢弃)
* free 释放通过上面三种方式申请的内存(一定要记得)
*
*/void foo11(int a)
{printf("hello %d\n", a);
}int main()
{void(*pfun)(int a) = foo11;pfun(5);int age = 120;printf("%p %d\n",&age,*&age);//char* ages = malloc(5 * sizeof(char)); //c++出错ages = "sss"; //不要改变动态内存分配指针的指向,因为改了之后就没有办法释放了//strcpy(ages, "shixiaobin");//free(ages); //ages = NULL; //释放之后置为NULL是一个好的习惯//puts(ages); //w葺葺葺輂 释放之后,不要再访问内存了//动态申请一个5行3列的二维数组int** parr = malloc(5 * sizeof(int*));memset(parr, 0, 5 * sizeof(int*));for (int i = 0; i < 5; i++){parr[i] = calloc(3, sizeof(int));for (int k = 0; k < 3; k++){parr[i][k] = k;}}for (int i = 0; i < 5; i++){for (int k = 0; k < 3; k++){printf("%d ", parr[i][k]);}putchar('\n');}//如何释放for (int i = 0; i < 5; i++){free(parr[i]);}free(parr);return 0;
}
这篇关于16.3指针复习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!