C语言-指针(一)

xiaoxiao2021-02-27  166

本章讲述指针,指针是一个难点,也是一个重点!!!

这一小节分为六个板块来讲:

一、指针的定义;

二、指针变量;

三、访问指针指向的变量;

四、声明指针变量;

五、未被初始化的指针(野指针);

六、空指针


一、指针的定义 (1)地址和指针

变量的本质是什么?内存中的存储单元,即每一个变量都需要在内存中分配一块空间来保存它的值,如int a = 5;编译器需要在内存中分配4个字节来存储5这个值。

数据保存在内存中,而每一块内存空间都有一个编号,占用4个字节称为内存地址,如 0×12FF3C,用来表示这个地址编号的变量称为指针变量。

通过指针可以访问和处理指针所指向的变量,增加了访问数据的手段,使程序更加灵活。


(2)指针的概念

指针本身也是一个变量,它存储的是另一个变量的地址。

存放变量地址的变量是指针变量,因此,一个指针变量的值就是某个变量的地址。为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”。

1 2 3 4 5 6 7 8 9 10 11 #include<stdio.h> int main() { int a = 5;//编译器会在内存中给变量a分配4个字节 //这块空间的名字叫a,这块空间也有一个编号:0x12FF3C //用一个变量来存储它的编号:指针 int *p = &a; printf("%d\n",a); printf("%p\n",p); return 0; }

char aChar =  ‘G’;

char *p = &aChar;

*p表示指针变量基本的名字;*表示p是一个指针变量,可以存储一个变量的地址;&表示取地址运算符,返回变量的地址编号;

二、指针变量

指针变量适用于存储另一变量的地址,它具有以下四个特点:

①它的值是一个地址:

1 2 3 4 5 6 7 8 9 #include<stdio.h> int main() { int a = 5; int *p = &a; printf("p = %p\n",p); printf("&a = %p\n",&a); return 0; }

②指针变量的值可以改变,存储一个新的地址,即指向别的变量;

1 2 3 4 5 6 7 8 9 10 11 #include<stdio.h> int main() { int a = 5; int b = 10; int *p = &a;//指针变量a 指向别的变量 printf("p = %p\n",p);   p = &b;//指针变量值改变,指针指向别的变量 printf("p = %p\n",p); //p = 0x7fff5fbff808 return 0; }


三、访问指针指向的变量

通过指针变量可以间接访问指针所指向的变量的值。

对于右图所示的存储结构,想要访问内存中的5这个值,有两种方式:

(1)通过变量名 a;

(2)通过*p对指针解引用;

1 2 3 4 5 6 7 8 9 #include<stdio.h>   int main() { int a = 5; int *p = &a; printf("%d,%d\n",a,*p); return 0; }

间接运算;

把运算符*放在指针名前面就可以访问指针所指向的变量

设已定义好的整数型变量a和整数型变量pa,且pa指向变量a,则printf(“%d”,pa);//输出pa指向变量的值,即输出a的值

*pa = 100;//给pa所指向变量赋值100,即给a赋值100,等价于a = 100;

1 2 3 4 5 6 7 8 9 10 11 #include<stdio.h>   int main() { int a = 5; int *p = &a;   *p += 3; printf("a = %d\n",a); return 0; }

结论:指针指向谁,解引用就是谁!


四、声明指针变量

例如;

char *p;

int *q;

float *r;

long double *s;

long int *t;

注意;声明指针变量的类型应和指针所指向的变量的类型保持一致。


五、未被初始化的指针

任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。

如定义int *p;则指针变量p未被初始化,它的指向是不明确的。

注意:因为野指针指向的内存空间位置不明确,因此不要对野指针解引用。

当一个指针成为“野指针”时,它指向哪里就是不可预知的了。当使用这个“野指针”时,即使程序运行没有问愿那也是非常危险的。因为这个“野指针”指向的内存空间,可能是某个重要的数据或其它程序,芸至是系统的重要内存位置。这样造成的危害是不可预知的,这个不可预知包括危害程度的不可预知和危害时间的不可预知的、像一颗不知何时会爆的定时炸弹。


六、空指针

指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存,否则它就是一个野指针。所以当我们不知道应该将指针指向何处时,应将指针置为NULL。

int *p = NULL;

指针是指向为NULL,它的值是0×0,即0号地址单元,永远不要试图去访问空指针指向的内容,因为它是系统内存单元,不允许用户级别的程序去访问,即对空指针解引用是非法的,会造成segmcnmtion fault(段错误)。

1 2 3 4 5 6 7 8 9 10 11 12 #include<stdio.h>   int main(void) { int a = 0; int *p = NULL; printf("%p\n",p);   //任何一个变量都需要在内存中分配一块空间来存储他的值,任何的一个空间 //在内存中都有地址编号 0x0 return 0; }

输出结果:0000000

空指针与野指针的区别:

野指针:未被初始化的指针,里面的内容是垃圾地址,它的值是不明确的;

空指针:被初始化为NULL的指针,里面的地址是0;

注意:不要解引用空指针或野指针

转载请注明原文地址: https://www.6miu.com/read-13424.html

最新回复(0)