有三种内存的分配方式:
1.静态存储区分配,编译期间就已经分配好,一直存在(函数外部变量,static);
2.(动态)栈创建,处理器自行处理,效率高但是内存有限(函数参数,局部变量);
3.(动态)堆分配,程序员分配,自行管理,存在内存碎片,容量大(malloc/free)。
为什么使用指针
结构紧凑
运行效率高
可表示一些复杂的数据结构类型
可以让函数返回多值
函数就是指针
动态分配内存,灵活
指针的基本知识
两个部分:地址+该指针的类型
两种类型:数据指针和函数指针
指针与地址的区别:一个变量,一个常量
占用内存大小
32位机器 - 4byte
64位机器 - 8byte
指针的使用
1.定义
int a = 1;
// int * p = 3;//错误,野指针,未指向任何内存
int * p = &a;//使用前先初始化,p指向a的地址
2.指针与字符串,数组
char arr[5] = {'a','b','c'};// 内存 a b c . . /o
char * p = "abc" // 内存 a b c /o
p++;//正确,指向b
arr ++;//错误 arr : 元素首元素的地址 &arr :数组指针
3.指针与二位数组
char arr[][5] = {"aaa","bbb","ccc"};
arr : 数组行指针
&arr:数组首列首地址
注意:
区别 int * p[], int (*p)[];
区别 二维数组和指针数组(就是区别数组和指针)
4.指针与函数
int p();
int *p();//函数,返回指针
int (*p)();//指针,指向返回int值的函数
int *(*p)();//指针,指向返回int型指针的函数
5.指针与函数参数方面的问题
5.1修改指针对应的值
//1.交换两个数的值;正确
void swap(int * a,int * b){
int temp = *a;
*a = *b;
*b = temp;
}
调用
swap(&a,&b);
//2.交换两个数的值;错误//仅仅改变了参数的地址,与原数据无关
void swap(int * a,int * b){
int * temp = a;
a = b;
b = temp;
}
调用
swap(&a,&b);
//3.交换两个数的值;正确//使用二级指针改变了源数据的指针
void swap(int ** a,int ** b){
int * temp = a;
a = b;
b = temp;
}
调用
swap(&a,&b);
网友评论