c语言指针初级

指针其实就是一个变量,只不过它和普通变量有所不同,我们知道变量是用来存值的,指针也不例外,只不过它存的值是一个地址,即就是用来标记某块内存的位置。

指针的定义:

首先我们定义一个指针 :基类型 * 指针变量名;

int i=0;
int* p=&i;

这里我们定义了一个int* 类型的指针,我们用该指针变量存储一个整型数据的地址(&i)。

指针的解引用:

‘ * ’之前有数据类型时并和数据类型一起出现时表示定义一个该类型的指针变量,当仅与后面的变量组成时表示取指针变量指向地址的值,即就是解引用。

int i=0;
int *p=&i;
printf("%d\n",*p);

指针的作用:

当作形参变量,在初学者学习指针时基本都会写过使用一个函数交换两个数的值,这个函数中使用两个指针变量作为形参变量通过地址修改地址中的值来改变两个变量的值。

void swap(int *x, int *y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
}

这里就涉及到值传递和址传递
值传递时,相当于在函数内对实参进行了一份临时拷贝,则在此函数内对形参进行的任何操作都不对实参造成任何该改变。形象地说就是将实参复制了一份,在函数内对这份复制的实参进行任何操作都不会改变原件。
址传递时,在函数内通过对传入的实参地址操作,改变地址中的数据,从而达到改变实参的效果。形象地说就是将实参的地址或者操作权限复制了一份给形参,这样形参也可以通过自己保存的地址或权限对实参进行修改。
例如交换两个数的值:

void swap(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}
void swap(int *x, int *y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
}

第一个交换函数就是将实参拷贝给了变量x和y,这里的x和y保存在该swap函数的调用栈空间中,其中后续的交换操作只是将该栈中的x和y变量进行了交换,实参并不受影响!
第二个函数是将实参的地址传递给了x,y指针变量,x,y保存了两个实参的地址,在函数内部通过访问实参存储的地址来改变实参的数据,从而达到了真正改变实参的值。
那么指针的使用仅仅只是用来交换两个数吗?
当然不是!不知道大家在写代码中有没有碰到过这样的问题?

void fun(int arr[10])
{
	int n = sizeof(arr);
	printf("%d\n", n);
}
int main()
{
	int arr1[10] = { 0,1, 2, 3, 4, 5, 6, 7, 8, 9 };
	fun(arr1);
	printf("%d\n", sizeof(arr1));
	return 0;
}

打印结果:
在这里插入图片描述
不知道大家是否接受这样的结果,反正刚开始我是不理解的,为什么同样是10个int类型元素的数组,结果不应该都是40个字节吗?
首先,sizeof是在程序编译过程就已经执行,而此时arr数组还没有开辟空间,所以sizeof计算的是arr作为指针类型所占的空间,
其次,其实在数组传参的时候只是将数组的首地址传递给了函数,而接受的形参无论你写成数组形式还是指针形式,其接收的都是首地址,所以在函数内部,该形参只相当于一个指针,所以在函数内部打印出来的值为一个指针变量的字节空间。
这样有什么好处呢?
当出现数组传参时,不必拷贝整个数组,只需将首地址传递过去即可,这样极大的节省了时间和空间的开销
最后补充一个特殊的指针:void*指针详解

上面就是我学到指针初阶的认识,如有问题,请您指出,谢谢观阅!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值