C语言之指针初涉

指针

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



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值