指针
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:%d\n",*b);//指针指向的内存空间的内容} 编译结果:printf("指针变量b的内容b:%d\n",b); //指针变量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 指针变量初始化
说明:第一种和第二种均是正确的,第三种不建议使用,原因是将char类型变量的地址赋值给int型变量的地址#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; */ }
注意:使用指针变量时,必须明确该指针变量指向的内存空间(变量),因此必须对指针变量初始化;如果不能明确其指向的对象,就将其初始化为NULL未完待续...constant指针
链接:1--点击打开链接,2--点击打开链接,3--点击打开链接,4--点击打开链接,5--点击打开链接,6--点击打开链接