翻过指针这座山!(1)

在C语言中,指针无疑是什么重要的。学完指针之后感觉收获很多,再加上之前的数组这一块可以很好的与指针联动,所以我想给大家
分享我的一点小知识。
什么是指针?
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(pointsto)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。用一个很简单的代码说明:

#include <stdio.h>
int main()
{
int a = 10;//在内存中开辟一块空间
int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
   //将a的地址存放在p变量中,p就是一个之指针变量。
return 0; }

变量a在内存中开辟空间时,会伴随着一个地址,这就相当于门牌号,这时候有个钥匙指向这个地址,这个钥匙在C语言中被叫做指针,对变量取地址后就可以用一个指针接受,以后调用这个变量,就可以用指针操作。指针指向的是地址,而如果想要打开房子,则需要解引用&,&解引用后就可以访问地址,在下面的指针介绍中将会介绍函数参数的传参以及数组的传参。在这篇博客中先简单介绍一下指针。
指针的指针类型基本和变量的数据类型差不多,但是与变量的数据类型的字节大小不一样来说,指针在32位操作系统下字节大小都是四个字节,char类型的指针是为了存放char类型变量的地址,short类型的指针则是存放short类型变量的地址,int也是同样的道理。现在这样看,可能比较规范化,但是在实际应用中这个用处不大,因为特有的变量数据类型要通过特有的指针来接收,这样子有很大限制,所以有个万金油的指针类型void在实际应用中可以用void指针来接收一切数据的指针,在接受过来他们的地址后,可以强转为其他任意类型的指针来进行实际操作。因为void类型的指针不能解引用,也不能进行指针的运算。
为什么会有指针类型这个东西?他的意义是什么?
下来请看一段代码:

int main()
{
int n=10;
char*pc=(char*)&n;int*pi=&n;
printf("%p\n",&n);
printf("%p\n",pc);
printf("%p\n",pc+1);printf("%p\n",pi);
printf("%p\n",pi+1);
return 0;
}

在这串代码中指针加整数则是指针向前或者向后走多大距离,在这个过程中什么类型的指针在解引用时就用几个字节。
指针和数组
在数组这一块首先有两点小知识:数组名代表数组首元素的的地址
p[i]中"[]"自带解引用,p[i]=>*(p+i),这两个是等价的。
指针指向一个数组主要就是指向数组首元素的地址,给个代码说明:

#include<stdio.h>
int main()
{
	int a[10] = { 1 };
	printf("%p\n",a);
	printf("%p\n", &a[0]);
	return 0;
}

运行结果:
在这里插入图片描述
所以这个值都是一样的
所以可以直接写成:int *p=arr;
数组名当作地址被指针访问,这样可以验证第二点结论:

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int*p = arr;
	int len = sizeof(arr) / sizeof(arr[0]); 
	int i = 0;
	for (i = 0; i < len; i++)
	{
		printf("&arr[%d]=%p == == == == == == == == p + %d = %p\n", i, &arr[i], i, p + i);
	}
		return 0;
}

运行结果如下:在这里插入图片描述
二级指针:
直接给张图方便说明:在这里插入图片描述
以上就是关于指针的一点小知识,这个系列的第一节,知识都比较简单。在以后我的博客中将会增加难度。希望各位大佬能够多多赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值