Linux C - C基础篇七(初识指针)
在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个元素这两个地址之间相隔数据元素的个数。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
漏电开关相关文章:漏电开关原理 漏电保护开关相关文章:漏电保护开关原理 汽车防盗机相关文章:汽车防盗机原理