No.9 指针小议(初学版)

指针小议:

指针,是C语言的精华。顾名思义,它可以指向一个东西。我在刚刚初识指针时就想象到了钟表上的“指针”。通过它的箭头,就可以看出时间。也可以形象地理解为“钟表表盘上的指针指向了某个数字,从而得知具体时刻。”举个通俗的例子吧,我住在101号房间,这个“101”就好比指针,“我”就是这个指针所指向的内容。若联想到计算机的内存方面,指针就是一块内存单元的地址。这个地址需要存储在一个变量里,这个变量就成为“指针变量”,而这块内存单元里的变量值,就是指针变量所指向的值。

指针的专业解释:

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

有关指针的代码(促进理解):

指针是个变量,存放内存单元的地址(编号)。
对应到代码:
#include <stdio.h>
int main()
{
	int a = 10 ; //在内存中开辟一块空间
	int* p = &a ; //这里我们对变量a,取出它的地址,可以使用&(解引用操作符,上篇博客提到过)将a的地址存放在p变量中,p就是一个指针变量。
	return 0 ;
}

总结:指针就是变量,用来存放地址的变量(存放在指针中的值都被当做地址来处理)。
那么问题来了:
1.一个小的内存单元到底是多大呢?(1byte)
2.内存是如何编址呢?
对于32位的机器,假设有32根地址线,那么32根地址线产生的地址就会是:
00000000 00000000 00000000 00000001 ~11111111 11111111 11111111 11111111
这里就会有2^32个地址。

每个地址标识一个字节,那我们就可以这样来计算:

(2^32 bit == 2^32 / 8 byte == 2^32 / 1024 KB == 2^32 /1024 /1024 MB == 2^32/1024/1024/1024 GB == 4GB) 我们就可以给4G的空闲空间进行编址。

指针变量的类型

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

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

有关指针的应用小实例:

#include <stdio.h>

void swap(int* p1, int* p2)
{
	int tmp =  0 ;
	tmp = *p1 ;
	*p1 = *p2 ;
	*p2 = tmp ;
}

void exchange(int* pt1, int* pt2, int*pt3)
{
	if (*pt1 > *pt2)
		swap(pt1, pt2) ;
	if (*pt1 > *pt3)
		swap(pt1, pt3) ;
	if (*pt2 > *pt3)
		swap(pt2, pt3) ;
}

int main()
{
	int a = 0 ;
	int b = 0 ;
	int c = 0 ;
	int *pa, *pb, *pc ;
	printf("请输入三个数字:") ;
	scanf("%d%d%d", &a, &b, &c) ;
	pa = &a ;
	pb = &b ;
	pc = &c ;
	exchange(pa, pb, pc) ;
	printf("\n%d %d %d\n" , a, b, c) ;
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/studyhardi/article/details/83112025