新闻  |   论坛  |   博客  |   在线研讨会
Linux C - C基础篇七(初识指针)
嵌入式Linux | 2023-01-12 14:51:45    阅读:164   发布文章

概念

在C语言中,所有的变量都是存放在内存中,内存可以理解为一组有序字节组成的数组,每个字节都有唯一的地址。CPU通过内存寻址对存储在内存中的数据对象的地址进行定位,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针其实是保存另一个变量的地址,我们能够通过这个地址从而间接地操作这个变量。每个指针都有一个对应的数据类型,不同指针之间的区别不在指针本身,而在于指针所指的变量的类型上。

指针的定义

我们通过在标识符前加一个操作符 * 来定义指针变量。如下,定义一个指向int类型的指针ip,ip没有指向任何实际的对象。

int *ip;

定义一个指针变量ip1,ip1被初始化为val的地址,通常在变量名前加上&表示取变量的地址。

int val = 100;

int *ip1 = &val;

ip和ip1都指向val,持有同样的地址值。

ip = ip1;

指针不能指向非地址值,例如下面的赋值是错误的:

ip1 = val;

指针不能被初始化或赋值为其他类型对象的地址值,例如下面的指针赋值都是错误的:

double dval;

ip = &dval;

通常在指针的前面加上一个*代表取出指针指向地址里面的值:

val = *p1;

C提供了一种特殊的指针类型,空(void*)类型指针,它可以被任何数据指针类型的地址值赋值。void*表明相关的值是个地址,但该地址的对象类型不知道,我们不能够操作空类型指针所指向的对象,只能传送该地址值。

void * vp;

vp = ip;

vp = &dval;

指针的运算

c语言中,可以对指针变量p进行p++、p--、p + i等运算,运算所得结果同样是一个指针,只不过指针所指向的内存地址相比于p所指的内存地址前进或者后退了i个操作数。用一张图来说明一下整型指针的操作:

p是一个 int 类型的指针,指向内存地址 0x0000001C 处,则p++将指向与p相邻的下一个内存地址,由于 int 型数据占 4 个字节,因此 p++ 所指的内存地址为0x0000001C+4即0x00000020,其余依次类推。不过要注意的是,这种运算只是改变了它所指向的地址。

数组与指针

在C语言中,指针与数组之间的关系非常紧密,许多可以用数组完成的工作同样可以使用指针来完成。

先声明一个数组:

int ia[10];

其中ia既表示数组的数组名,也代表着数组的首地址,还代表数组首元素的地址,同时我们可以用ia + i来代表数组中第i个元素的地址。那么用指针如何表示呢?

int *ip;

ip = ia;

声明一个指向int型的指针ip,上面说了ia是个整型数组的地址,所以可以直接赋值给ip,这时ip也指向ia这个数组的首地址。ia[i] 就等效于 *(ia+i) 等效于 *(ip+i) 等效于 ip[i] 。同时我们可以用&ia[i] - &ia[j] 表示第i个元素和第j个元素这两个地址之间相隔数据元素的个数。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
专注于嵌入式Linux知识的分享、交流
推荐文章
最近访客