什么是指针:
指针是一种特殊的数据类型,使用它可以定义指针变量,指针变量中存储的是整型
数据,代表了内存的编号,通过这个编号可以访问对应的内存
为什么要使用指针:
1、函数之间是相互独立的,但有时候需要共享变量
传参是单向值传递
全局变量容易命名冲突
使用数组还需要传递长度
命名空间是独立的,但是地址空间是同一个,所以指针可以解决这个问题
2、由于函数之间传参是值传递(内存拷贝),对于字节数较多的变量,值传递的效率较低,
如果传递的是变量的地址,只需要传递4\8个字节,可以提高传参效率
3、堆内存无法取名字,它不像data、bss、stack内存段可以让变量名与内存之间建立联
系,只能使用指针记录堆内存的地址,以此来使用堆内存
如何使用指针:
定义: 类型* 变量名_p;
1、指针变量与普通变量的用法是有很大区别的,建议在取名时以p结尾加以区分
2、指针的类型表示存储的是什么类型数据的地址,它决定了通过这个指针变量可以访问的字节数
3、一个*只能定义一个指针变量
int* p1,p2,p3; // 只有p1是指针变量,p2 p3是int
int *p1,*p2,*p3; // p1 p2 p3都是指针变量
4、指针变量与普通变量一样,默认值是随机的,一般初始化为NULL
赋值: 变量名_p = 地址;//必须是有权限且有意义的地址
指向栈内存:
int* p = #
指向堆内存:
int* p = malloc(4)
解引用: *变量名_p;
通过指针变量中记录的内存编号去访问内存,该过程可能产生段错误,根源是由于赋值时存储了一个
非法的内存编号
*p <==> num
注意:解引用时访问的字节数取决于定义指针变量时的类型
发生段错误善用断点:printf("------------\n");
练习1:实现一个变量的交换函数,然后调用它对一个数组进行排序
#include <stdio.h>
void exchange(int* p1,int* p2)
{
int tmp = 0;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
printf("%d %d\n",*p1,*p2);
}
int main(int argc,const char* argv[])
{
int arr[10] = {
7,6,4,7,5,21,4,8,95,0};
for(int i = 0; i<10; i++)
{
int min = i;