详解C语言中的指针类型

您所在的位置:网站首页 c语言中指针类型在scanf中 详解C语言中的指针类型

详解C语言中的指针类型

2024-02-03 01:15| 来源: 网络整理| 查看: 265

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

什么是指针类型

在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 #include #include void main() { char* x; short* y; int* z; x = (char*)1; y = (short*)1; z = (int*)1; system("pause"); return; }

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

指针类型的自加和自减

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

#include #include #include 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 #include #include 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 #include #include 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 #include #include 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 #include #include 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 #include #include 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,输出的结果依然是正确: 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3