天天看点

详解C语言中的指针类型

文章目录

      • 什么是指针类型
      • 定义带 * 类型的变量
          • 总结
      • 指针变量的赋值
      • 指针变量宽度
      • 指针类型的自加和自减
          • 总结
      • 指针类型的加减运算
          • 总结
      • 指针类型的比较

什么是指针类型

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

详解C语言中的指针类型

定义带 * 类型的变量

先看定义的这几个变量:

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个字节存储:

详解C语言中的指针类型

即使后面有多个 * ,宽度也是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;
}
           

运行结果:

详解C语言中的指针类型

这没什么好说的,太常规了,我们看一下指针类型的自加是怎么样的:

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

运行结果:

详解C语言中的指针类型

发现不同了吧,指针类型的自加或者自减,处理的是去掉*后的字节宽度,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;
}
           

运行结果:

详解C语言中的指针类型

这时候结果又都相同了,都加了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;
}
           

运行结果:

详解C语言中的指针类型

先不急着总结,在写一个多*的看看什么结果:

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

运行一下,发现不同了吧:

详解C语言中的指针类型
总结
  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;
}
           

运行结果:

详解C语言中的指针类型

看一下反汇编:

详解C语言中的指针类型

这里可以看到,比较用的指令是jbe,这个jbe是无符号数比较,也就是说指针类型在比较的时候是不看符号的,即使这里a等于-200,输出的结果依然是正确:

详解C语言中的指针类型

继续阅读