指针——C语言之魂(1)

根据自己的学习进度,本篇博客将会对C语言的灵魂部分——指针做一个初级的描述,以及一些基本细节的讲解。欢迎阅读指正。

指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。注意,指针是一个变量

指针所占空间的大小

在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。 如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

指针的类型

其实定义指针的类型跟平时定义变量的类型差不多,具体如下。

char  *pc = 0; 
int   *pi = 0;
short *ps = 0; 
long  *pl = 0; 
float *pf = 0; 
double *pd = 0;

既然指针作为一个变量,那么一定能够进行整数的加减。定义指针类型的意义在于此。那么当指针加减整数的时候,它的结果到底是根据什么来计算的呢?我们来看以下代码。

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; 
}

通过以上代码发现,在C语言中指针加减整数是通过指针的类型做判断的。指针的类型所占用几个字节,那么每加1结果便多加1个类型字节。例如int型在32位操作系统下占用4个字节,那么指针每加1,结果便加4。char型占用一个字节,同理。

而在指针减指针的时候,结果为俩个指针之间相差元素的个数。只有在两个指针同时作用于同一块内存时,才有意义。

并且,指针的类型还决定了,对指针解引用的时候有多大的权限(能操作几个字节)。比如:char的指针解引用就只能访问一个字节,而 int 的指针的解引用就能访问四个字节。

二级指针

既然指针是个存放地址的变量,那么指针的地址又在哪里呢?

答案非常简单,我们通过代码来看。

int main()
{
  int a = 0;
  int *p = &a;
  int **p1 = &p;
  return 0;
}

以上代码中,存放指针p的地址的变量p1就是二级指针,它指向p。

大端与小端

在初步学习指针之后,还有一个重要的概念——大端与小端便可以开始摸索了。要了解这个,首先得明白什么是大端,什么是小端。

大端就是“低地址存放高数据”。而小端与之相反“低地址存放高数据”。

那什么又叫做低地址呢?低地址即为首先访问到的地址,低数据即为排序靠后的数据,这么说有点摸不清头脑,通过代码来理解。

int main()
{//判断设备是大端还是小端
	int n = 0x12345678;
	char *pc =  (char*)&n;
	if(*pc == 0x78)
	{
		printf("is little\n");//是小端 低地址存放低数据
	}
	else
	{
		printf("is not little\n");//是大端 低地址存放高数据
	}
return 0}

由于n的地址为0x12345678,而强转为char*类型之后职能读取一个字节,即两个数字,如果访问到了低数据78,那么可判断为小端,反之则为大端。

我们所使用的手机一般是大端,而电脑一般是小端

指针与数组

在数组里使用指针是指针应用的重要部分之一。首先来说一个最基本的。请看以下代码。

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

运行代码,会发现打印的两个值一模一样。这串代码的目的在于证明一个重要的结论::数组名表示的是数组首元素的地址。于是当我们以后想要访问一个数组首元素的地址的时候,可以直接用整个数组名代替。顺便说以下打印地址要使用上文中的%p哦。

现在我们可以直接通过指针访问数组了。

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

像这样通过在每次循环里解引用数组首元素的地址慢慢向后加一,就可以实现用指针访问数组了。顺带一提,代码中的sizeof求数组长度的方法非常好用而且通用哈。

在这里提出简单的指针指向数组,作为一个引子,准备在下一篇博客中开始详细总结指针的各类拓展,如指针数组,数组指针,函数指针等,欢迎继续阅读指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值