




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C语言由浅入深理解指针目录1.相关概念2.指针的定义方法3.指针的分类4.指针和变量的关系5.指针与数组的关系6.指针的运算
1.相关概念
操作系统给每个存储单元分配了一个编号,从ox00000000~0xffffffff,这个编号称为地址,指针就是地址指针变量:即这个变量用来存放一个地址编号无论什么类型的地址,都是存储单元的变换,在32位平台下都是4个字节,即任何类型的指针变量都是4个字节大小,64位操作系统占8个字节。对应类型的指针变量,只能存放对应类型的地址。例如整型指针变量,只能存放整型变量的地址。
#includestdio.h
intmain()
char*a;
short*b;
int*c;
long*d;
float*e;
double*f;
printf("sizeof(a)=%d\n",sizeof(a));
printf("sizeof(b)=%d\n",sizeof(b));
printf("sizeof(c)=%d\n",sizeof(c));
printf("sizeof(d)=%d\n",sizeof(d));
printf("sizeof(e)=%d\n",sizeof(e));
printf("sizeof(f)=%d\n",sizeof(f));
return0;
}
可见,我的操作系统是64位的。
为什么在64位系统中指针的大小是8,而32位的却是4?
64位系统,这个位数指的是CPU里面的通用寄存器的数据宽度为64位,也就是说一个地址占二进制位数是64,所以:
sizeof(double*)==sizeof(int*)==sizeof(char*)==64/8==8
32位系统,同理,他的一个地址占32位二进制空间,sizeof(double*)==sizeof(int*)==sizeof(char*)==32/8==4
其实明白了两个系统的寻址原理就能明白,大体就是这个原因。地址跟系统有关,但是基本数据类型占的大小是由C语言本身决定。
2.指针的定义方法
数据类型*指针变量名
intp;//定义了一个指针变量p在定义指针变量的时候,是用来修饰变量的,代表指针变量。
关于指针的运算符:
取地址*取值
#includestdio.h
intmain()
inta=100;
int*p;//定义一个指针变量
p=//给指针变量赋值
printf("a=%d,%d\n",a,*p);//*p等价于变量a
return0;
拓展:如果一行中定义多个指针变量,每个变量前面都要加*修饰
3.指针的分类
字符指针短整型指针整型指针长整型指针float型指针double型指针函数指针结构体指针指针的指针数组的指针
4.指针和变量的关系
引用变量的方法:
1.直接通过变量的名称
2.通过*指针名称引用
#includestdio.h
intmain()
int*p1,*p2,temp,a,b;
p1=
p2=
printf("请输入a,b的值:\n");
scanf("%d%d",p1,p2);//和之前的scanf不同,这里直接用p1p2作为写入地址。
temp=*p1;//用p1指向的变量a给temp赋值
*p1=*p2;//用p2指向的变量b给p1指向的变量a赋值
*p2=temp;//temp给p2指向的变量b赋值
printf("a=%db=%d\n",a,b);
printf("*p1=%d,*p2=%d\n",*p1,*p2);
return0;
如果想让不同类型的指针相互赋值的时候,需要强制类型转换:
#includestdio.h
intmain()
inta=0x1234,b=0x5678;//4个字节
char*p1,*p2;//char类型只能保存一个字节
printf("%#x%#x\n",a,b);
p1=(char*)//强制类型转换
p2=(char*)
printf("%#x%#x\n",*p1,*p2);
p1++;//指针向上移动
p2++;
printf("%#x%#x\n",*p1,*p2);
return0;
5.指针与数组的关系
指针保存的是数组第一个元素的地址
也可以通过*(p+2)=100给当前地址的下一个变量赋值
#includestdio.h
intmain(){
inta[5]={0,1,2,3,4};
int*p;
p=a;
//指针指向数组a的第一个元素的首地址
printf("a[2]=%d\n",a[2]);
printf("p[2]=%d\n",p[2]);
//*(a+n)==*(p+n)==a[n]==p[n]
printf("*(p+2)%d\n",*(p+2));
printf("*(a+2)%d\n",*(a+2));
printf("p=%p\n",p);
printf("p+2=%p\n",p+2);
return0;
}
6.指针的运算
指针可以加一个整数,往下指几个它指向的变量,结果还是地址
#includestdio.h
voidtest1()
inta[10];
int*p,*q;
p=a;
q=p+2;//pq间隔8个字节,意味着加一个整数最终移动的字节数与指针变量的类型也有关系
printf("p=%p\n",p);
printf("q=%p\n",q);
return;
intmain()
test1();
return0;
}
两个相同的指针可以比较大小
前提:指向同一个数组的元素
#includestdio.h
voidtest2()
inta[10];
int*p,*q;
p=a[1];
q=a[6];
if(pq)
printf("pq\n");
elseif(pq)
printf("pq\n");
else
printf("p=q\n");
return;
intmain()
//test1();
test2();
return0;
}
两个同类型的指针可以做减法
前提:指向同一个数组元素,减法的结果是指针指向的中间有多少个元素
#includestdio.h
voidtest3()
inta[10];
int*p,*q;
p=a[0];
q=a[3];
printf("%ld\n",q-p);
return;
intmain()
//test1();
//test2();
test3();
return0;
}
两个相同类型的指针可以相互赋值
#includestdio.h
voidtest4()
inta=100;
int*p,*q;
p=
printf("
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新入职工入职安全培训考试试题含答案(巩固)
- 2025年班组安全培训考试试题含答案(能力提升)
- 2024-2025公司管理人员安全培训考试试题含答案【综合题】
- 以人为本的2025年市政工程考试试题及答案
- 2025年经济法概论题型预测
- 评估工程投资的外部经济效益试题及答案
- 经济法的重要性与试题及答案
- 行政管理的效率优化试题及答案
- 2025年公共关系学特训课程试题及答案
- 调整心态2025年中级经济师试题及答案
- 山西太原事业单位考试《行测》模拟题带答案2023年
- 人工智能与新闻生产
- 老年病人的健康管理
- 露天煤矿作业岗位责任制与操作规范
- 2025-2030国内外骨骼机器人行业市场发展现状及竞争格局与投资前景研究报告
- 晋升经理述职报告
- 疫苗出入库登记制度
- 融资岗专业考试题及答案
- 胸外科快速康复护理要点
- 阅读理解 20篇 集训-2025年人教版中考英语复习专练(含答案)
- 课程内容中的全球化视角探讨-深度研究
评论
0/150
提交评论