当前位置:首页 > IT课程问答

指针的使用 时间:2023-04-21      来源:华清远见

什么是指针?

在C语言中,操作系统屏蔽掉所有的硬件存储器,为程序员提供了一个类似数组的内存空间;

这个内存空间的基本单位是字节,也是程序员能够操作的基本单位。

指针就是每块基本单位大小的内存的地址,通常被叫做地址或者地址编号。将字节大小的内存

分别进行编号,有助于我们对于内存的使用。

用来存放指针的变量就是指针变量,这也是程序员通常所说的指针。以下所有的指针变量统称

为指针。

声明指针的格式:

存储类型指针类型*指针名;

eg:char*p;

int*p;等

存储类型:

不单独声明时,有两种情况

情况1:局部定义指针时,默认为auto类型。表示当进入代码块时,系统为自动变量分配内存.

在块内,这些变量被定义,并被认为他是局部于本块的.当退出块时,系统释放分配给自动变量的

内存,因此,变量值就丢失了.重新进入块,系统会为自动变量再次分配内存,原先的值已经没有

了。

情况2:全局定义指针时,默认为extern类型。表示为该变量永久的分配存储,直到当前进程

运行结束。全局变量在整个程序执行期间都是存在的。

指针类型:

由于指针保存的是地址,所以地址相关的变量或者结构,都可以作为指针的类型;

如:char、short、int、long等基本类型所定义的指针类型就是char*、short*、int*、

long*等

指针也可以保存数组的地址,该指针就变成了数组指针;指针也可以保存结构体变量的地址,

该指针就变成了结构体指针;指针也可以保存函数的地址,该指针就变成了函数指针;

*号:

*号有两个作用:

作用1:在定义时,和普通变量做区分,如果没有*号,那就和普通变量的定义格式一致,没

有任何的区别了;

作用2:在使用时,*变量名这个形式表示拿到指针保存的地址上的数据;后面详细说;

指针名:

指针名是一个标识符,要符合标识符的命名规范;

注:标识符的命名规范:

1、由数字、字母、下划线组成

2、不能以数字开头

3、不能和关键字冲突,严格区分大小写

指针的大小?

指针的大小和类型没有关系,和CPU的运行时的寻址位数有关系;

在32位操作系统中,32位CPU一次最大能够访问32位数据,所以指针的大小就是32位,即4

字节;

在64位操作系统中,64位CPU一次最大能够访问64位数据,所以指针的大小就是64位,即8

字节;

验证:

使用64位编译器:

linux@ubuntu:~$gcc01test.c

linux@ubuntu:~$./a.out

sizeof(char*)=8

sizeof(short*)=8

sizeof(int*)=8

sizeof(long*)=8

linux@ubuntu:~$cat01test.c

#include<stdio.h>

intmain(intargc,constchar*argv[])

{

printf("sizeof(char*)=%ld\n",sizeof(char*));

printf("sizeof(short*)=%ld\n",sizeof(short*));

printf("sizeof(int*)=%ld\n",sizeof(int*));

printf("sizeof(long*)=%ld\n",sizeof(long*));

return0;

}

使用32位编译器:

linux@ubuntu:~$gcc01test.c-m32

linux@ubuntu:~$./a.out

sizeof(char*)=4

sizeof(short*)=4

sizeof(int*)=4

sizeof(long*)=4

linux@ubuntu:~$cat01test.c

#include<stdio.h>

intmain(intargc,constchar*argv[])

{

printf("sizeof(char*)=%d\n",sizeof(char*));

printf("sizeof(short*)=%d\n",sizeof(short*));

printf("sizeof(int*)=%d\n",sizeof(int*));

printf("sizeof(long*)=%d\n",sizeof(long*));

return0;

}

指针类型有什么作用?

由于一个指针只能保存一个地址,一个地址仅仅代表一个字节内存,而通常情况下,程序员定

义变量都不不止使用一个字节;所以如何让指针访问到占有多个字节内存的变量的其他数据,

就是通过指针类型;

指针类型决定着指针一次能够访问的最大内存空间;

举例:

linux@ubuntu:~$./a.out

a=0x12345678

p=0x7fff5eec899c

*p=0x12345678//当指针类型和指针所保存变量的类型相同时,能够正常获取到变

量的数据

linux@ubuntu:~$cat01test.c

#include<stdio.h>

intmain(intargc,constchar*argv[])

{

inta=0x12345678;//定义一个变量a,保存16进制数0x1234567,总共占4字节

int*p=&a;//定义一个指针,保存变量a的地址

printf("a=%#x\n",a);//#号表示数字前导符,16进制的前导符,是0x,%x表示打印

16进制数

printf("p=%p\n",p);//由于指针p中保存的是地址,打印地址用%p

printf("*p=%#x\n",*p);//*p表示取到指针保存的地址上的数据,*p<==>a

return0;

}

这是我们正常使用指针,保证使用的指针类型和保存的数据类型一致,防止数据丢失;以上示

例中,指针能够正常取到变量a的4个字节内存上的所有数据;

如果将上述示例修改:

linux@ubuntu:~$./a.out

a=0x12345678

p=0x7ffe4b4f344c

*p=0x78//当指针类型和指针所保存变量的类型不同时,不能够正常获取变量的数据

linux@ubuntu:~$cat01test.c

#include<stdio.h>

intmain(intargc,constchar*argv[])

{

inta=0x12345678;//定义一个变量a,保存16进制数0x1234567,总共占4字节

char*p=(char*)&a;//定义一个char*类型的指针,保存int类型的变量a的地址,

由于类型不一致,编译器会报警告,所以将&a的类型强制转换为char*类型。消除警告;

printf("a=%#x\n",a);

printf("p=%p\n",p);

printf("*p=%#x\n",*p);

return0;

}

由上述示例得知,当指针类型和指针所保存变量的类型不同时,不能够正常获取变量的数据,

指针所获取到的数据大小由指针决定;

0x78总共占1个字节,和char*类型的指针,所能访问的数据长度一致;

如何使用指针?

指针的使用只需要记住两点

1、指针保存的是已定义的变量地址,不能保存未经定义的常量和地址;

2、指针提供另一种操作变量数据的方法,主要和*号有关;

指针是怎么进行偏移的?

指针的偏移,就是指针的运算,指针和普通变量一样,也是可以进行运算的,但是和普通变量

不一样的是,普通变量的运算是对普通变量中保存的数据继续宁运算,而指针的运算和指针类

型有关。

最常使用的指针偏移操作为:p++或者p--等

示例:

linux@ubuntu:~$./a.out

p=0x7ffddc670170//这是指针p中保存的地址

*p=10//这是指针p中保存的地址上的数据,发现为*p==str[0]

p=0x7ffddc670174//这是指针p进行偏移,即p++之后,指针p中保存的地址

*p=20//这是指针p中保存的地址上的数据,发现为*p==str[1]

p=0x7ffddc670178//这是指针p再次进行偏移,即p++之后,指针p中保存的地址

*p=30//这是指针p中保存的地址上的数据,发现为*p==str[2]

linux@ubuntu:~$cat01test.c

#include<stdio.h>

intmain(intargc,constchar*argv[])

{

intstr[5]={10,20,30,40,50};//定义一个数组,有5位元素,每位元素都是int类型

int*p=str;//定义一个int*类型的指针,当前保存的是数组的首地址,也是数字首位

元素的地址,str作为数组名,也表示数组的首地址

printf("p=%p\n",p);//打印当前首元素的地址

printf("*p=%d\n",*p);//打印首位元素

p++;//指针进行偏移,等价于p=p+1;表示指针p像后偏移1次,并不是表示p中的

地址加1,地址怎么变化取决于指针类型

printf("p=%p\n",p);

printf("*p=%d\n",*p);

p++;

printf("p=%p\n",p);

printf("*p=%d\n",*p);

return0;

}

由示例可以发现,对于int*类型的指针,虽然只是进行p++操作,但是真正的地址的运算却是

+4;和指针类型有关;

综上所述:

1、指针保存的是地址,地址是内存中每一个字节大小空间的编号

2、指针的*号可以帮助指针获得指针保存地址上的数据内容

3、指针的类型决定指针所能够访问的内存大小,指针类型还和指针偏移有关

4、指针大小固定,32位系统中占4字节,64位系统中占8字节

5、指针不能使用常量和未使用的地址进行初始化,会出现野指针

上一篇:嵌入式-C++函数的重载

下一篇:结构体要考虑的字节对齐问题

戳我查看2021年嵌入式每月就业风云榜

点我了解华清远见高校学霸学习秘籍

猜你关心企业是如何评价华清学员的

干货分享
相关新闻
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2024 北京华清远见科技发展有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部