详解C语言中的指针类型

本文详细介绍了C语言中的指针类型,包括指针类型的定义、指针变量的赋值、指针变量的宽度、指针类型的自加自减及加减运算,以及指针类型的比较。重点讲解了指针自增时根据不同数据类型处理字节宽度的规则,并通过实例展示了指针类型的加减运算和比较操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是指针类型

在C语言中,指针类型就是数据类型,是给编译器看的,也就是说,指针类型与数组、int、char这种类型是平级的,是同一类的。
在这里插入图片描述

定义带 * 类型的变量

先看定义的这几个变量:

double a;
int b;
short c;
char d;
float e;
struct p player;

这都是之前我们用到的类型,它们的含义、内存的分配我们都了解了,这所有的类型,后面都可以跟一个 * ,就像这样:

double* a;
int* b;
short* c;
char* d;
float* e;
struct* p player;
总结
  1. 任何变量都可以带 * ,加上 * 以后变成新的类型,统称“指针类型”。
  2. *可以是任意多个。

指针变量的赋值

以前我们赋值都是直接赋值,其实是简写的,它的完整形式是这样:

int x;
x = (int)1;

现在我们要给指针类型的变量赋值,就可以这么写:

int* x;
x = (int*)1;

即使是变量与变量至之间赋值,只要类型相同,也是可以的。

指针变量宽度

我们看一下指针变量的宽度是怎么分配的:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void main()
{
	char* x;
	short* y;
	int* z;

	x = (char*)1;
	y = (short*)1;
	z = (int*)1;

	system("pause");
	return;
}

查看反汇编可以看到,无论你定义的是什么样的指针类型,最终都是4个字节存储:
在这里插入图片描述
即使后面有多个 * ,宽度也是4字节。

指针类型的自加和自减

我们先看一下基本类型的自加:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void main()
{
	char a;
	short b;
	int c;
	a = 1;
	b = 2;
	c = 3;
	a++;
	b++;
	c++;
	printf("%d %d %d \n",a,b,c);
	system("pause");
	return;
}

运行结果:
在这里插入图片描述
这没什么好说的,太常规了,我们看一下指针类型的自加是怎么样的:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void main()
{
	char* a;
	short* b;
	int* c;
	a = (char*)1;
	b = (short*)1;
	c = (int*)1;
	a++;
	b++;
	c++;
	printf("%d %d %d \n",a,b,c);
	system("pause");
	return;
}

运行结果:
在这里插入图片描述

发现不同了吧,指针类型的自加或者自减,处理的是去掉*后的字节宽度,char是1个字节,short是2个字节,int是4个字节,所以当a,b,c都为1的时候,自加的结果因为数据类型的不同而不同,变成了2,3,5。

但是,这里我们用的都是一个 * 的指针类型,如果 * 是多个,会是什么结果呢?

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void main()
{
	char** a;
	short** b;
	int** c;
	a = (char**)1;
	b = (short**)1;
	c = (int**)1;
	a++;
	b++;
	c++;
	printf("%d %d %d \n",a,b,c);
	system("pause");
	return;
}

运行结果:
在这里插入图片描述
这时候结果又都相同了,都加了4,这是因为一个指针类型在堆栈中占4个字节,所以只要两个*及以上,最终的自加自减结果都是以4来处理的。

总结
  1. 不带*的类型自加自减以1来处理。
  2. 带一个*的指针类型自加自减以去掉 * 后的类型宽度来处理。
  3. 两个*及以上的指针类型自加自减以4来处理。

指针类型的加减运算

其实指针类型的自加与自减我们弄明白了以后,它的加减运算我们就不难理解了,看一下这个例子:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void main()
{
	char* a;
	short* b;
	int* c;
	a = (char*)1;
	b = (short*)1;
	c = (int*)1;
	a = a+5;
	b = b+5;
	c = c+5;
	printf("%d %d %d \n",a,b,c);
	system("pause");
	return;
}

运行结果:
在这里插入图片描述
先不急着总结,在写一个多*的看看什么结果:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void main()
{
	char** a;
	short** b;
	int** c;
	a = (char**)1;
	b = (short**)1;
	c = (int**)1;
	a = a+5;
	b = b+5;
	c = c+5;
	printf("%d %d %d \n",a,b,c);
	system("pause");
	return;
}

运行一下,发现不同了吧:
在这里插入图片描述

总结
  1. 指针类型可以加减一个整数,但不能乘除。
  2. 指针类型的变量+n=指针类型的变量+n*(去掉一个n后类型的宽度)。
  3. 指针类型的变量-n=指针类型的变量-n*(去掉一个n后类型的宽度)。

指针类型的比较

指针类型也是可以进行比较的:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void main()
{
	char* a;
	char* b;

	a = (char*)200;
	b = (char*)100;
	if(a>b)
	{
		printf("正确!\n");
	}
	else
	{
		printf("错误!\n");
	}
	return;
}

运行结果:
在这里插入图片描述
看一下反汇编:
在这里插入图片描述
这里可以看到,比较用的指令是jbe,这个jbe是无符号数比较,也就是说指针类型在比较的时候是不看符号的,即使这里a等于-200,输出的结果依然是正确:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值