C_指针_1

指针是什么

在科学计算机中,指针是编程语言的一个对象,利用地址,他的值直接指向存在电脑存储器中另一个地方的值.通过地址能找到所需的变量单元,可以说,地址指向该变量单元.因此,将地址形象化的称为"指针".通过它可以找到以它为地址的内存单元.

int a = 10;//在内存中开辟一块空间
int *pa = &a;//对于变量a,用&操作符取出它的地址存放在pa中,pa就是一个指针变量

所以指针是一个用来存放地址的变量.

每次计算机要将程序执行起来.就要将程序加载到内存,这就要合理的使用及分配内存,在对计算机内存进行管理时,可以想象把计算机的内存分成很多个小的单元,每个单元都有自己一个独一无二的地址,经过计算发现一个字节对应一个地址是比较合适的.

对于32位的机器,假设有32根地址线,每根地址线在寻址的时候会产生一个电信号(0或1),那么就会有2的32次方个地址,每个字节对应一个地址,2^{32} = 2^{10} * 2^{10} * 2^{10} * 2^{2},即4G的大小.

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

指针变量和指针类型

我们都知道,变量有不同的类型,整形,浮点型等等,那么指针有没有类型?当然是有的,上面的代码,将a的地址保存到pa中,pa就是一个指针变量,那他的类型是怎样的呢,

我们给指针变量相应的类型

char *pc = NULL;
int *pi = NULL;
float *pf = NULL;
long *pl = NULL;
double *pb = NULL;

指针的类型就是type + *,我们可以看到,char *类型是为了存放char类型的变量,int *是为了存放int类型的变量.这样做确定了指针运算的规律.

指针+-整数

#include<stdio.h>
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);
	system("pause");
	return 0;
}

 

 

 由此可以看到,指针的类型决定了指针向前或向后走一步有多大,即指针加1就是加上其所指向类型的大小.

指针的解引用

#include<stdio.h>
int main()
{
	int n = 0x11223344;
	char *pc = (char*)&n;
	int *pi = &n;
	*pc = 0x55;
	*pi = 0;
	system("pause");
	return 0;
}

 首先看n在内存中的存储

 对pc解引用之后

对pi解引用之后

由此可见,指针的类型决定了对指着进行解引用时有多大的权限,char *的解引用只能访问一个字节,int *的解引用就能访问四个字节

二级指针

我们知道,指针存放的是地址,指针也要在内存中开辟空间,那么指针的地址存放在哪里?答案是二级指针

. 如上图所示,二级指针存放着一级指针的地址,对二级指针解引用,即对ppa解引用,找到的是pa,*ppa就是访问pa

**ppa先通过*ppa找到pa,再对pa解引用找到的是a

指针运算

指针加减整数

对指针加减整数,就是加上或减去其所指向类型的大小,看代码

#include<stdio.h>
#define Nv 5
int main()
{
	float value[Nv];
	float *vp;
	for (vp = &value[0]; vp < &value[Nv];)
	{
		*vp++ = 0;
	}
	for (int i = 0; i < Nv; i++)
	{
		printf("%d ", value[i]);
	}
	system("pause");
	return 0;
}

指针-指针

int my_strlen(char *s)
{
    char *p = s;
    while(*p != '\0')
        p++;
    
    return p-s;
}

通常情况下,两个指针指向同一个数组(字符串),两指针相减,通常情况下是这两个指针之间元素所经历的个数

 

猜你喜欢

转载自blog.csdn.net/yikaozhudapao/article/details/81122615