指针、内存地址和指针取值

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

指针是一个存储计算机内存地址的变量,引用表示计算机内存地址,从指针指向的内存地址中读取数据称作指针取值。

指针可以指向某些具体类型的变量地址,例如:int、long和double。

当声明变量时,用 * 表示这里声明了一个指针。其它情况用到 * 表示指针的取值。&是地址操作符,用来引用一个内存地址。通过在变量名字前使用&操作符,我们可以得到该变量的内存地址。

 

void指针、未初始化的指针和NULL指针

指针可以被声明为void类型,比如void *x,声明之后但没有被赋值叫做未初始化,赋值为NULL叫作NULL指针。

 

指针和数组

C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象,指针用来存储单个内存地址。数组和指针不是同一种结构因此不可以互相转换,而数组变量指向了数组的第一个元素的内存地址。指向数组的指针必须声明为void类型或者和数组的元素类型保持一致。

一个数组变量是常量,即使指针变量指向同样的地址或者另一个数组,也不能把指针赋值给数组变量。也不能将一个数组变量赋值给另一个数组。但可以把一个数组变量赋值给指针,把数组变量赋值给指针时,实际上是把指向数组第一个元素的地址赋给指针。

 

指针和结构体

指向结构体的指针存储了结构体第一个元素的内存地址。指向结构体的指针必须声明为void类型或者和结构体类型保持一致。

 

 1 #include <stdio.h>
 2 
 3 int main(int argc, char *argv[]){
 4 
 5     int *p;  //声明一个int指针(未初始化)
 6     void *void_p; //空指针,可以存储任意类型的指针或引用
 7     int *null_p = NULL; //NULL指针
 8 
 9     int a = 1; //声明一个int变量
10 
11     printf("未初始化:\t *p=%p \n", p);
12 
13     p = &a; //为指针分配一个int变量的引用
14     printf("赋值后:\t *p=%p \n", p);
15 
16     int b = *p; //对指针取值,即获取指针指向地址空间里的内容
17     printf("取值:\t *p=%d b=%d \n", *p, b);
18 
19     a = 10; //改变a的值
20     printf("再取值:\t *p=%d b=%d \n", *p, b);
21 
22     void_p = p;// void_p 指向另一个指针
23     printf("void指针:\t *void_p=%d\n", *(int *) void_p); //通过显示转换,把一个void指针转成int指针并进行取值
24 
25 
26     int array[5] = {0, 1, 2, 3, 4};
27     p = array;
28 
29     printf("指向数组的指针:\t array[0]=%d, array[1]=%d, array[2]=%d \n", *(p), *(p + 1), *(p + 2));
30 
31 
32     struct person {
33         int age;
34         char *name;
35         int height;
36     };
37     struct person man;
38     struct person *man_p;
39 
40     man.age = 21;
41     man.name = "张三";
42     man.height = 176;
43 
44     man_p = &man;
45     printf("结构体指针:\t name=%s, age=%d, height=%d \n", man.name, (*man_p).age, man_p->height);
46 
47     exit(0);
48 
49 }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄