指针
- 指针是C语言的精华,同时也是其中的难点和重点,我在近日对这一部分内容进行了重新的研读,把其中的一些例子自己重新编写和理解了一遍。此篇博客的内容即是我自己对此书例子的一些理解和总结。
一.大问题:指针是什么?
我的理解:
变量的本质即内存,指针即访问变量的地址。利用指针来 <间接访问> 变量。
定义一个指针,p是指针变量名,系统自动为其分配内存,存放的是其指向的变量(内存)的地址。
例如:
1> int a=4;
2> int *p;
3> p=&a;
上述程序定义一个变量a,系统自动为其分配内存,那么这个内存的名称就是a,其存放的值是4。
再定义一个整形指针p,系统也为其分配内存(根据指针的类型分配不同大小的内存单元,例如此处指针为int类型,计算机为其分配4个字节),该内存里存放的是指向名称为a的内存的地址。
- 变量的本质是什么?-变量名只是一个代号,变量的本质就是内存。
- 指针保存的是什么?-指针保存的是内存地址。
这样来看,会不会对指针理解更加清楚一点呢?
草图:
待解决
二.指针变量
- 使用指针变量
- 定义指针变量
- 引用指针变量
- 指针变量作为函数参数
1.int *p1,*p2;
p1-p2是什么?
#include<stdio.h>
int main()
{
int a[4]={
3,4};
int *p1=&a[0],*p2=&a[1];
printf("%d %d\n",p1,p2);
printf("%d ",p2-p1);/*p2-p1=地址之差/数组元素的长度
就是p1所指向的元素与p2所指向的元素差之间几个元素*/
return 0;
}
我的理解:
p1指向数组a的首元素a[0],p2指向数组a的a[1],p1-p2代表的是a[0]与a[1]之间相隔几个元素。
输出结果:
计算机自动处理为
p2-p1=地址之差/数组元素的长度.
而不是简单的地址之差=4.
2.输入三个整数按从大到小的顺序输出.(指针变量作为函数参数)
- 错误解法:
#include<stdio.h>
void swap(int *p1,int *p2,int *p3)
{
int *p;
if(*p1<*p2)
{
p=p1;
p1=p2;
p2=p;
}
if(*p1<*p3)
{
p=p1;
p1=p3;
p3=p;
}
if(*p2<*p3)
{
p=p2;
p2=p3;
p3=p;
}
}
int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
printf("%d %d %d\n",a,b,c);
int *point_1=&a,*point_2=&b,*point_3=&c;
swap(point_1,point_2,point_3);
printf("%d %d %d\n",*point_1,*point_2,*point_3);
return 0;
}
输入样例:7 8 9
输出结果:
- 正确解法: