【RUNOOB】C语言学习之指针
资料来源:
(1) runoob;
(2) C语言程序设计;
注1:Runoob中对于指针的讲述比较清晰简单,摘录出来(后续补充指针与结构体,指针与函数参数);
1.指针与变量的内存位置
(1) 每个变量都有一个内存位置,它表示了一个在内存中的地址,通过"&运算符+变量名"可以访问变量地址;
(2) 指针就是内存地址,指针变量是用来存放内存地址的变量;
(3) 指针变量的类型需要与指针所指向的变量或常量的类型相同;如下图,指针变量p存放用于整型变量var_runoob在内存中的地址; *p中的*返回位于操作数所指向地址的变量的值;
(4) 指针使用示例及执行结果
1 #include <stdio.h> 2 3 int main () 4 { 5 int var = 20; /* 实际变量的声明 */ 6 int *ip; /* 指针变量的声明 */ 7 8 ip = &var; /* 在指针变量中存储 var 的地址 */ 9 10 printf("var 变量的地址: %p\n", &var ); 11 12 /* 在指针变量中存储的地址 */ 13 printf("ip 变量存储的地址: %p\n", ip ); 14 15 /* 使用指针访问值 */ 16 printf("*ip 变量的值: %d\n", *ip ); 17 18 return 0; 19 }
1 执行结果: 2 var 变量的地址: 0x7ffeeef168d8 3 ip 变量存储的地址: 0x7ffeeef168d8 4 *ip 变量的值: 20
2.null指针
(1) 在指针变量声明的时候,如果没有确切的地址可以赋值,可以为指针变量赋一个NULL;赋为NULL值的指针称为空指针;
3.void指针类型
(1) void类型指针变量理解为"指向空类型"或"不指向确定的类型"的数据;或者,简单理解为无类型指针;
(2) 当把void指针赋值给不同基类型的指针变量(或相反)时,编译系统会自动进行转换,不必用户进行强制转换;当然,用户也可以显式转换;
1 示例:隐式转换 2 #include <stdio.h> 3 4 int main() { 5 int a=3; 6 int *p1=&a; 7 int *p2; 8 void *p3; 9 p3=p1; //系统自动转换; 10 p2=p3; //系统自动转换; 11 printf("*p1=%d\n",*p1); 12 printf("*p2=%d\n",*p2); 13 14 }
1 示例:显式转换 2 #include <stdio.h> 3 4 int main() { 5 int a=3; 6 int *p1=&a; 7 char *p2; 8 void *p3; 9 p3=(void *)p1; //显式转换 10 p2=(char *)p3; //显式转换 11 printf("*p1=%d",*p1); 12 printf("*p2=%d",*p2); 13 }
1 示例:显式转换 2 typedef struct { 3 unsigned char cnt; 4 } c7; 5 6 void * counter7_new() { 7 c7 * c=(c7 *) malloc(sizeof(c7)); //malloc函数的原型为void * malloc(unsigned int size),所以该处采用了显式转换; 8 9 }
注1:sizeof用于计算某个数据类型或某个变量在内存中占用的字节数(byte);
4.结构体指针(指针与结构体)
4.1 命名一个新的类型名代表结构体类型;
1 typedef struct { 2 int month; 3 int day; 4 int year; 5 } Date;
4.2 指针指向结构体变量以及通过指针使用结构体变量的成员
注1:结构体变量的起始地址存放在了指针变量中;
1 #include <stdio.h> 2 3 typedef struct{ 4 int month; 5 int day; 6 int year; 7 } Date; 8 9 10 int main() { 11 Date date1; 12 Date *p; 13 p=&date1; 14 15 date1.month=1; 16 date1.day=1; 17 date1.year=2023; 18 19 printf("struct pointer format1-month/dayyear: %d/%d/%d\n",p->month,p->day,p->year); 20 printf("struct pointer format2-month/dayyear: %d/%d/%d\n",(*p).month,(*p).day,(*p).year); 21 22 23 24 }