C语言之指针初涉
来源:互联网 发布:上海游奇网络老板是谁 编辑:程序博客网 时间:2024/05/22 23:53
指针
1---概念
指针就是一种数据类型,用来表示内存地址
指针变量的声明:数据类型名 *指针变量名,从理解上:(数据类型名 *)就是指针类型
形如:int *a;
使用指针类型声明的变量就是指针变量,a就是指针变量
指针变量作用:可以对内存空间进行灵活的操作
访问内存的方式:直接访问、间接访问
实例1 直接和间接访问
#include<stdio.h>void main(void){int a=12;printf("直接访问:%d\n",a); //直接访问内容printf("间接访问:%d\n",*(&a));//间接访问}
编译结果:
间接访问:*(&a)------地址操作符(&)获取变量a的地址,再使用指针操作符(*)获取该地址的内存内容
实例2 指针变量四个属性
#include<stdio.h>void main(void){int * b; //为什么放在第一行就可以,放在其它地方不行?int a=12;printf("直接访问:%d\n",a); //直接访问内容printf("普通变量a的地址&a:%d\n",&a);//普通变量的地址b=&a; //指针变量b指向a的内存地址printf("指针变量b的内容b:%d\n",b); //指针变量b的内容printf("指针变量b的地址&b:%d\n",&b);//指针变量b的地址printf("指针指向的内存空间的内容*b:%d\n",*b);//指针指向的内存空间的内容}编译结果:说明:第三行的代码有误,&b错误应该是b
&a-----1506880----变量a的内存地址1506880,此地址的内容为520&b-----1506892----指针变量b的内存地址1506892,此地址的内容为&a,也即:1506880指针变量:b指针类型:内存地址(所指向)的数据类型,也即520的数据类型*b的机理:先找到与变量a对应的内存地址“&a”,再根据此地址找到a分配的空间,获取a的值(获取指针变量b指向的内存空间的内容)地址就是指针,一个变量的地址就是一个指针型常量
指针变量的四个属性1--指针变量的地址-------------------------------15068922--指针变量的值(内存内容)--------------------15068803--以指针变量的值为地址的空间地址-----15068924--指针指向的内存空间的内容------------------520
注:指针的所有变化都会通过这4个属性反映出来
错误代码:
分析:错误原因(后续报道)
实例3 测试指针类型的字节长度
#include<stdio.h>void main(void){printf("sizeof(int *)=%d\n",sizeof(int *)); //int*类型的字节长度printf("sizeof(char *)=%d\n",sizeof(char *));//char*类型的字节长度printf("sizeof(float *)=%d\n",sizeof(float *));//float*类型的字节长度}编译结果:
说明:指针类型存储的是地址的值,因此字节长度由系统的内存地址长度决定,32位的指针类型的字节长度为4,与其指向内存存储的数据类型无关注:2、3的值虽然一样,但有区别----指针变量的值为一个内存空间的内容,可以改动;指针变量指向的空间地址是一个内存空间地址,这是一个常量不可改变
实例4 使用指针访问和修改变量
#include<stdio.h>void main(void){int a=520;int *b; //定义指针变量b=&a; //指针变量b指向a的内存空间printf("修改之前变量a的内容:a=%d\n",a); //通过变量a访问a的内存空间printf("普通变量a的地址&a:%d\n",&a);//普通变量b的地址printf("通过指针变量b访问a的内存空间:*b=%d\n",*b);//通过指针变量b访问a的内存空间*b=3; //改变b指向的空间内容printf("改变b指向的空间内容之后----------\n");printf("改变b指向的空间内容之后:a=%d\n",a); //此时a的值printf("普通变量a的地址&a:%d\n",&a);//普通变量b的地址改变了没有?printf("修改之后变量a的内容:a=%d\n",a); //通过变量a的内存空间改变了没有printf("指针变量b的内容b:%d\n",b); //指针变量b的值(内存内容)printf("指针变量b的地址&b:%d\n",&b);//指针变量b的地址(内存内容)printf("指针指向的内存空间的内容*b:%d\n",*b);//指针指向的内存空间的内容(通过指针变量b访问a的内存空间)}编译结果
说明:使用指针的间接访问方式"*b=3"成功的改变了a的内存空间注意:指针变量只能赋值为地址或其它指针的值
实例5 多次给指针变量赋值,指针变量的变化
#include<stdio.h>void main(void){int a=520;int b=521;int *p;printf("间接访问:%p\n",&a);//%p为指针类型的16进制的格式输出printf("间接访问:%p\n",&b);//b的地址printf("第一次赋值前----------\n");printf("赋值前指针变量的地址:%p\n",&p);printf("赋值前指针变量的内存内容:%p\n",p);//printf("赋值前指针指向的内存内容:%d\n",*p);//此行报错printf("第一次赋值后----------\n");p=&a;printf("第一次赋值后指针变量的地址:%p\n",p);printf("第一次赋值后指针变量的内存内容:%p\n",&p);printf("第一次赋值后指针指向的内存内容:%d\n",*p);printf("第二次赋值后----------\n");p=&b;printf("第二次赋值后指针变量的地址:%p\n",p);printf("第二次赋值后指针变量的内存内容:%p\n",&p);printf("第二次赋值后指针指向的内存内容:%d\n",*p);}编译结果
说明:将变量赋值的过程,就是使指针指向新的内存空间的过程
注意:如果将指针变量赋值为整数,而此整数是一个有效的内存空间,程序可以正常运行,即使这样也要尽量避免,同时很难保证整数值有效,以免产生不可预测的问题。
实例6 指针变量初始化
#include<stdio.h>void main(void){/*int a=0;int* p1=&a;printf("第一种初始化方式----------\n");*//*char b='0';char* p2=&b;printf("第二种初始化方式----------\n");*/int* p3=NULL;//正确的初始化(推荐使用)printf("第三种初始化方式----------\n");/*不提倡的初始化方式char b='0';int* p2=&b;*/}说明:第一种和第二种均是正确的,第三种不建议使用,原因是将char类型变量的地址赋值给int型变量的地址
注意:使用指针变量时,必须明确该指针变量指向的内存空间(变量),因此必须对指针变量初始化;如果不能明确其指向的对象,就将其初始化为NULL未完待续...constant指针
链接:1--点击打开链接,2--点击打开链接,3--点击打开链接,4--点击打开链接,5--点击打开链接,6--点击打开链接
- C语言之指针初涉
- C语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- c语言之指针
- c语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- c语言之指针
- c语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- python使用百度语音识别API注意事项
- struts2传递参数的三种方式
- telnet测试端口
- 用powerDesigner生成数据库时_用列名称代替注释
- Java基础:浅析Java中的final关键字
- C语言之指针初涉
- hbase的coprocessor使用
- java 并发编程实战书籍学习 第四章 unmodifiableMap
- socket推送
- (windows)python安装opencv
- 随笔——新思路
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]
- 快速下载vs2013等开发工具--资源查找
- 内连接、左外连接、右外连接、交叉连接区别