指针基本概念
指针:就是内存的地址编号
指针变量:用来存放地址变量,通常所说的指针就是指针变量
定义指针 :格式 指针所指向的数据类型 *指针变量名称 int * a
作用
在定义变量的时候,*是一个类型说明符,说明定义这个变量是一个指针变量,在不是变量定义的时候,它是一个操作符,访问指针所指向的存储空间
&作用 取地址符,取出变量的地址,*与&是一对反操作符
指针的初始化步骤
1 先定义指针变量然后初始化 int num=10
int *p ; 2 定义指针变量的同时进行初始化 int *#*p=20;
如果指针只有定义没有初始化,那么它里面是垃圾值,也就是它指向是不确定的,那么此时我们称这个指针为野指针
2 不能给指针变量直接赋值一个整形的数值
指针与函数:1 指针作为函数参数
1: 指针作为函数参数传递是地址传递
2:如果你仅仅是在被调函数中,去修改变量本身的值,是不会影响函数中变量的值的
3 基本数据类型作为函数参数是值传递
4 数组作为函数参数是地址传递
2 指针作为函数的返回值(指针函数)
1 不能使用局部变量的指针作为函数的返回值
2
可以是指向堆内存和常量去的指针作为函数返回值
3 函数指针:指向函数指针(重点)
格式:所指向的函数的返回值类型(*指针变量名称)(所指向的函数的形藏列表)
写一个函数指针的步骤
1 ,把要指向的函数的头拷贝过来
2 ,用小括号把函数名称扩起来
3 ,在函数名称前面加 *
4 ,修改函数名称为指针变量名称
让函数指针指向某个函数 pointer = 函数名称 同过函数指针调用 pointer(实参列表)
注意点:函数指针与所指向的函数,返回值类型和形参列表必须一致
指针与数组
1 一维数组 1.1 指针像一个数组
使用数组方式和使用指针方式都可以去访问数组中某个元素
array[1] == pointer[1] ==
*(array+1) == *(pointer+1)
1.2 array = &array pointer !=
&pointer
1.3 指针的指向可以改变的,数组的指向时不可以改变的
1,4
当把一个数组赋值给一个指针变量的时候,有些信息就丢失了sizeof(array)!=sizeof(pointer)
2 指针数组:元素为指针的数组 指针类型 数组名称[数组的元素个数] 比如: int *nums[5];
3 数组指针:数组中元素数据类型(*pointer)[所指向的一维数组元素个数]
数组指针与二维数组的数组名称相似
4 指针与二维数组 int nums[2][3] ={{12,13,14},{15,16,17}};
int (*pointer)[3] = nums;
*(nums+1) == nums[1] == *(pointer+1)它是加上一个一个一维数组所占用存储空间的字节数 int
*p = nums[1] +1 == &num[1][1]
5 指针与字符串
1
保存字符串的方式
1 使用char类型的一维数组 char name[]=
“zxc”;
2 使用char类型的指针 char *name ="zxc"
3 区别 1 字符数组是保存在栈中的,它里面的元素是可以任意的修改的 2
字符指针是一个指向常量的区指针,字符串中的元素是不可以修改的
1 字符串数组
1 使用char类型的二维数组 char names[][20] = {"nc","qd"}; 3
字符串数组 char *names = {"nc","qd"};
6 内存分区 (掌握)
从上到下
栈:用来保存局部变量 ,它的内存由系统管理的
堆:用来存储对象的,它是由程序员管理的
全局区:用来存放全局变量和静态变量
常量区:用来存放常量,只读的
代码区:用来存放代码,只读的
7 const关键字
1
const修改普通变量说明这个变量是只读的
2 const修改数组说明数组中元素是只读的
3 const修饰指针
const在*前面,说明指针所指向的存储空间是制度的
const在*后面,说明指针的指向是不可以修改的
4 const用来形参
1 函数内部不能修改函数外部的变量值
2
告诉函数的调用者你可以放心把数据传入我不会修改你的内容
5 const修饰函数的返回值
8 动态存储空间的使用
1 申请堆中的内存
int *pointer =
malloc(sizeof(int));
2 使用内存
*pointer=20;
3 使用完了需要手动释放
free(pointer);
4 清空指针
pointer = NULL
注意点 1 : 不能重复释放
2 堆中的存储空间在没有释放之前必须有一个指针指向这快内存,否则永远不能释放