C 指针
指针、内存地址和指针取值
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 }

更多精彩