c语言指针简易教程

指针是什么

在计算机中,要想存储一个数据,就需要一个计算机空间,而这个空间有自己的名字,就是地址,这里要知道,地址在计算机中的存在的形式是一大堆数,而指针就是用来存储数据的地址的一个变量。

指针的使用

每一个数据都有自己的数据类型,像int *p ;定义的就是一个int(整型)类型的指针,指针存储的是地址。

 

	int a[4]={0,1,2,3};
	int *p;
	p=&a[3];

像这里面定义了一个int类型的指针p,因为指针是一个存储数据的地址的变量,那么我们要想使用指针,就要用指针来存储数据的地址,又因为数据的地址在计算机中可能是一大堆很复杂的数,我们很难直接写出来,所以我们要用到取地址符(&)间接得到数据的地址,

p=&a【3】的意思就是将a【3】的地址赋给指针p

int main(){
	int a[4]={0,1,2,3};
	int *p,q;
	p=&a[3];
	printf("%d",*p);
	return 0;
} 

我们已经将一个地址赋给指针p了,p表示的是一个地址,

*运算符被称为间接值(indirect value)运算符,*p就是表示p的地址的所在的空间上的那个数据的值

像printf("%d",*p)就是输出了p的地址的所指的空间上的那个数据的值,之前 p=&a[3]就将a[3]的地址赋给的p,也就是说现在p的地址的所指向的空间上的值就是a[3]的值了。

 

	int a[4]={0,1,2,3};
	int *p,q;
	p=&a[3];q=a[1];
	printf("%d,%d",*p,q);

再看这个代码,其中用int*p,q;定义了两个变量,这里的含义是定义一个整型的指针p和一个整型变量q,而不是两个都是指针!而   int *p,*q;语句才是定义两个整型的指针变量p和q

 

如果直接将数据赋值给指针会怎样?

因为指针的定义是存储数据值的地址的变量,所以如果直接将数据赋值给指针,那么计算机就会认为赋值的这个值是个地址,那么如果在之后的命令中使用指针是,计算机就会去寻找与这个值的相同名字的地址上的值,当然这个时候地址上也不知道是存了什么东西,所以就很可能会出现错误。

就如整型变量a的地址是ox300000,a的值是1,而我直接p=a(平时整型的指针),那么p中所存储的地址就是1,但是这时候不知道计算机中地址名为1的空间里有什么东西,引用值时计算机就会引用地址为1的空间里的数据的值,与我们想要得到的值1是很有可能不同的。

两个指针相减会怎么样

	int * p,*q;
	int a[]={1,2,3,4,5,};
	p=&a[5];
	q=&a[0];
        printf("%d\n",p-q);

以上代码中是输出p-q的值,结果是5,这里p的地址是a[5]的地址,而q的地址是a[0]的地址,这里可以看出如果p与q同时指向了一个数组中的某些元素,那么p-q的结果就是其数组地址的角标的值的差。

        int * p;
	int* q;
	int *e;
	int a=1,b=2,c=3;
	p=&a;
	e=&b;
	q=&c;

	printf("%d\n",p-q);

再看看上面的代码,这次按顺序分着定义了a,b,c三个整型变量,使p指向a,使q指向c,那么,p-q的值是多少呢?是2,因为这里定义的顺序是a先定义。b其次,c是第三个定义的,那么整形变量b的地址就会比整型变量a的地址大4,整型变量c的地址比整形变量a大4,因为一个整型的大小是4字节,那么c的地址与a的地址的数值上的差是8,也就是两个整型变量的大小,也就是说p-q的值就是第三个整型变量a与第一个整型变量a的差,以整型变量为单位就是两个,输出的结果就是2.

数组与指针

数组与指针有着非同一般的关系,数组名就是一个指针,一系列数组实际上就是向计算机申请的一系列连续的空间,而数组名就是这个里的空间的首个数据的值的地址,而数组的角标起的作用就是引用首地址往后的角标大小的位置上的数据的值。

指针与const

const的作用是使其所定义的变量在之后的程序中无法被更改,因为指针也是变量,所以也可以用const,如果const与指针在一起用会怎么一样呢?

int const* p=&i与const int *p=&i的定义的作用是一样的,这样定义出的指针变量p的指向的对象是无法通过间接取值更改值的,例如i=10,想使用*p=12来更改i的值是不行的。

int* const p=&i;的作用是指针指向的变量没有办法更改,即如果存在另一个变量j,p=&j是不行的。

const的这两种情况的判断条件就是在*运算符之前还是之后,如果在之前就是无法用间接运算符改值但可以更改指针指向的变量,如果是之后就是无法改变指针指向的变量却可以用间接运算符改值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值