【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 }

 

posted on 2022-06-30 11:35  _见贤_思齐  阅读(265)  评论(0编辑  收藏  举报

导航