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--点击打开链接


 
原创粉丝点击