文章目录
-
-
- 什么是指针类型
- 定义带 * 类型的变量
-
-
- 总结
-
- 指针变量的赋值
- 指针变量宽度
- 指针类型的自加和自减
-
-
- 总结
-
- 指针类型的加减运算
-
-
- 总结
-
- 指针类型的比较
-
什么是指针类型
在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;
总结
- 任何变量都可以带 * ,加上 * 以后变成新的类型,统称“指针类型”。
- *可以是任意多个。
指针变量的赋值
以前我们赋值都是直接赋值,其实是简写的,它的完整形式是这样:
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来处理。
- 带一个*的指针类型自加自减以去掉 * 后的类型宽度来处理。
- 两个*及以上的指针类型自加自减以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;
}
运行一下,发现不同了吧:
总结
- 指针类型可以加减一个整数,但不能乘除。
- 指针类型的变量+n=指针类型的变量+n*(去掉一个n后类型的宽度)。
- 指针类型的变量-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,输出的结果依然是正确: