说明:通常我们所理解的地址为逻辑地址,指针是存储地址的一个变量,本文只对指针基础知识阐述,高级指针敬请期待C语言进阶篇的编写。
地址
地址
在计算机中,地址可分为逻辑地址、线性地址、物理地址;在进行C语言指针编程时,可以读取指针变量本身的值(&操作),实际上这个值就是逻辑地址,通常用十六进制的数字表示,它相对于你当前进程数据段的地址(偏移地址),这个地址不和物理地址相干。逻辑地址不是直接送到内存总线,而是被送到内存管理单元(MMU)。MMU由一个或一组芯片组成,其功能是把逻辑地址映射为物理地址,即进行地址转换。
示例:
#include <stdio.h>
int main() {
double a = 10.6;
double *pa = &a;
printf("%p\n",pa);
return 0;
}
运行结果:0x7fff5fbff830
指针
指针是什么?
- Describe(描述):指针是一种保存变量地址的变量。
- 如何定义一个指针变量?
格式:类型标识符 *变量名;
示例:int *p;
- 访问指针指向的存储空间
*p
; - 指针的作用:能够根据一个地址值,访问对应的存储空间。
指针所指向的类型:
当通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:int*ptr:指针所指向的类型是int
int(*ptr)[3]:指针所指向的的类型是int()[3]
- 说明:指针是一个特殊的变量,它里面存储的数值被理解成为内存里的一个地址,并不是说指针就是地址,指针是存储地址的一个变量,地址是内存分配。指针可以指向某个内存地址,也可以指向另外一个内存地址,当指针指向一个内存地址时,它们之间才形成关联,通过这个指针去操作这块内存,所以指针把我们带入到了地址层面去操作数据。
示例:
void fun(int *start,int n){
int *end,temp;
end = start + n-1;
while (start < end) {
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
int main() {
int array[5] = {1,3,4,6,8};
fun(array,5);
for (int i = 0; i < 5; i++) {
printf("%d\n",array[i]);
}
return 0;
}
使用注意
- 指针变量只能存储地址;
- 如果指针变量未经过初始化,不要拿来访问其他的存储空间;
- *是指针运算符,访问指针指向的存储空间。
总结
1.指针是存储地址的一个变量;
2.使用指针要注意这个指针的类型是什么?指针指向的类型是什么?指向了哪里?
练习
1.编写一个函数,其功能是对传送过来的两个浮点数求出和值、两个数相差多大,并通过形参传送回调用函数。
2.编写一个函数,对传送过来的三个数求出最大和最小数,并通过形参传送回调用函数。答案