C语言教学-数据类型与结构篇④
本文最后更新于 176 天前,其中的信息可能已经有所发展或是发生改变。

WARNING!!!WARNING!!!WARNING!!!

最难的地方来喽,当然我们不会太过于深入。有句话说得好,学好指针才算学好C。

指针

指针是什么?首先,它是一个值,这个值代表一个内存地址,因此指针相当于指向某个内存地址的路标。

字符*表示指针,通常跟在类型关键字的后面,表示指针指向的是什么类型的值。比如,char*表示一个指向字符的指针,float*表示一个指向float类型的值的指针。

int* intPtr;

上面示例声明了一个变量intPtr,它是一个指针,指向的内存地址存放的是一个整数。

你可能有点迷糊,我们从内存上面入手。

int a;

当我们声明了这样一个变量,假设我们的电脑是32位机。编译的时候它会在我们内存的某个区域选取连续的四个字节的位置,把他分配给变量a。假设我们内存地址是从0到255。他选取了0,1,2,3这四个位置给a,然后告诉内存这四个字节就是以后存放a的值的地方。

而如果我们用了指针,他也会分配内存给我们的变量,不过这个变量叫指针变量。你可能问这俩有啥区别呢?

区别就是普通的变量存储的是我们声明类型的数据。而指针变量存的是我们数据的地址。

* 运算符(解指针)

*这个符号除了表示指针以外,还可以作为运算符,用来取出指针变量所指向的内存地址里面的值。

int *p=&a;
假设a的地址为0001-0004,数据为1234。
*p=*p+1;

上面我们定义了一个指针,让它指向内存0001;经过上面的运算*p=1235;

& 运算符(取地址)

&运算符用来取出一个变量所在的内存地址。

int x = 1;
printf("x's address is %p\n", &x);

上面示例中,x是一个整数变量,&x就是x的值所在的内存地址。printf()%p是内存地址的占位符,可以打印出内存地址。

指针变量的初始化

声明指针变量之后,编译器会为指针变量本身分配一个内存空间,但是这个内存空间里面的值是随机的,也就是说,指针变量指向的值是随机的。这时一定不能去读写指针变量指向的地址,因为那个地址是随机地址,很可能会导致严重后果。

int* p;
*p = 1; // 错误

上面的代码是错的,因为p指向的那个地址是随机的,向这个随机地址里面写入1,会导致意想不到的结果。

正确做法是指针变量声明后,必须先让它指向一个分配好的地址,然后再进行读写,这叫做指针变量的初始化

int* p;
int i;
p = &i;
*p = 13;
上面示例中,p是指针变量,声明这个变量后,p会指向一个随机的内存地址。这时要将它指向一个已经分配好的内存地址,上例就是再声明一个整数变量i,编译器会为i分配内存地址,然后让p指向i的内存地址(p = &i;)。完成初始化之后,就可以对p指向的内存地址进行赋值了(*p = 13;)。

为了防止读写未初始化的指针变量,可以养成习惯,将未初始化的指针变量设为NULL

int* p = NULL;

NULL在 C 语言中是一个常量,表示地址为0的内存空间,这个地址是无法使用的,读写该地址会报错。

指针的运算

指针本质上就是一个无符号整数,代表了内存地址。它可以进行运算,但是规则并不是整数运算的规则。

int* j;
j = (int*)0x1234;
j = j + 1; // 0x1238

假设32位系统,int占4个字节。编译器会根据你的变量类型知道占用多少字节,且变量所占字节都是连续的,所以一般我们都说所占内存的首位。上面那个j+1代表的是指向下一个同类型的指针,所以指向的内存也就+4。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇