指针
2020-02-03 02:50
134 查看
文章目录
指针的定义、初始化、解引用
内存的编址
- 每个字节有唯一的地址,内存地址按字节编号
- 地址是一个无符号的整数,从0开始一次递增。地址常写成16进制。
变量的寻址
-
直接寻址
int a=0; scanf("%d",&a); // & 取地址运算符
-
间接寻址
通过指针类型存放变量的地址
指针(Pointer)
int a; int *pa = &a; printf("%p",&a); //输出变量a的地址 printf("%p",pa); //同上
基类型:指针变量指向的数据类型
-
注意:变量的地址是常量,而变量的指针仍是变量。
-
变量指针使用前必须初始化,若不明指向情况,请设置为NULL(NULL是值为0的宏,空指针不一定指向0地址)
指针的解引用
* 是间接寻址运算符,用于访问指针变量指向的变量的值
int a = 0; int *pa = &a; *pa = 1; //此时,a变量的值修改为1
指针变量作函数参数
基本类型:call by value 不可改变实参的值
指针类型: call by reference 可以改变实参的值
两数互换实例
void Swap(int *x,int *y) { int temp; temp=*x; *x=*y; *y=temp; }
void Swap(int *x,int *y) { int *ptemp; *ptemp=*x; //ptemp未初始化,无法对其对应的储存空间赋值 }
void Swap(int *x,int *y) { int *ptemp; ptemp=x; x=y; y=ptemp; } //仅仅交换了作为形参的指针变量的值,而实参变量的值并未改变
函数指针
定义
指向函数的指针变量
数据类型 (*指针函数名) (形参列表);
int Fun(int a, int b); int (*f)(int, int); f=Fun; //f指向函数Fun() int a,b; (*f)(a,b); //通过函数指针调用函数
函数指针变量储存的是函数在内存中的入口地址
注意:
int *f(int, int)是一个函数名为f,返回值是整型类型的函数
主要应用
编写实用性更强的函数
编写实现升序、降序的函数
void SelectionSort(int a[],int n,int (*compare)(int, int)) //高级的选择排序函数 { int i, j, k; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) { if((*compare)(a[i], a[k])) k=j; } if(k != i) { Swap(&a[k], &a[i]); } } } int Ascending(int a, int b) { return a<b; } int Decending(int a, int b) { return a>b; }
计算函数的定积分
float Integal(float (*f)(float),float a, float b) { float s,h; int n = 100,i; //将区间分为100份 s = ((*f)(a) + (*f)(b)) / 2; h = (b - a) / n; for (i=1; i<n; i++) { s = s + (*f)(a + i*h); } return s * h; }
使用指针的基本原则
- 指针必须初始化
- 明确指针指向单元的内容-基类型
- 基类型唯一
动态分配内存
void* malloc(unsigned int size)申请在堆上分配内存
- void* 指向任意类型
- 使用时,使用(*type)强转
int *p; p = (*float)malloc(n*sizeof(int));
free(p) //释放
;- 问题:内存碎片,内存泄漏,野指针
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 总结了一些指针易出错的常见问题(六)
- c语言多级指针
- 指针数组功能测试
- C语言指针数组和数组指针粗浅认识
- C#和内存指针
- 指针指向字符串和数组储存字符串区别
- 数组指针和指针数组的区别
- 指针中的*运算符与++运算符优先级:++优先级与 *运算符 相同 ,都大于 +运算符
- 关于指针的名字
- 数组指针和指针数组的区别
- 纯c与c++:函数传递-指针/引用,typdef struct + 结构体/枚举
- sizeof()数组名和指针的结果
- C++如何声明类成员函数指针或类成员变量指针(A::*)
- 经典问题解析(1)---const和引用、指针与引用、函数重载、C方式编译
- C# CLR via 对象内存中堆的存储【类型对象指针、同步块索引】
- 二维数组中的指针类型(行指针和列指针)
- C语言指针实现排序算法
- 指针--内存 malloc free
- 数组指针和指针的一个经典例子
- C 专家编程笔记(三) 数组和指针