资料来源:

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

【RUNOOB】C语言学习之指针的更多相关文章

  1. c语言学习笔记 - 指针和字符串

    前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...

  2. c语言学习笔记 - 指针和数组

    结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多. #include <stdio.h> int mai ...

  3. c语言学习笔记.指针.

    指针: 一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 声明: int *ptr; /* 一个整型的指针,指针指向的类型是整型 */ double *ptr; /* 一个 double 型 ...

  4. C语言学习之指针

    指针这块,看了好久才有点头绪,稍微有点理解了. 一.指针申明以及赋值 int *p; 这样就声明了一个int型的指针p,这个p就是指针变量,可能上述的书写方式会混淆我们队指针的理解(*号) 我们可以这 ...

  5. C语言学习笔记--指针阅读技巧

    1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复 2.3 步骤,直到阅读结束 注 ...

  6. C语言学习笔记--指针和数组的关系

    1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译 ...

  7. C语言学习笔记--指针概念

    指针也是一种变量,占有内存空间,用来保存内存地址,在32位系统中指针的占用的内存大小为4个字节 1.*号的意义 (1)在指针声明时,*号表示所声明的变量为指针 (2)在指针使用时,*号表示取指针所指向 ...

  8. C语言学习笔记--指针与字符串

    字符类型 char(character)是一种整数,也是一种特殊的类型:字符.这是因为 ① 用单引号表示的字符字符字面量:‘a’,'1' ②‘’也是一个字符 ③printf和scanf里用%c来输入. ...

  9. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  10. GO语言学习(十五)Go 语言指针

    Go 语言指针 Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 接下来让我们来一步步学习 Go 语言指针. 我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地 ...

随机推荐

  1. Mybatis 实体类驼峰命名与数据库字段之间映射

    数据库的命名规则和 Java 的命名规则不一致,导致实体类与数据库字段不能完美映射. 一.可以在 mapper.xml 中通过 resultMap 来解决: <resultMap id=&quo ...

  2. Map Inference in the Face of Noise and Disparity代码环境搭建

    1. 引言 地图生成算法网站Mapconstruction by pfoser里可以看到许多关于地图生成算法的介绍,Map Inference in the Face of Noise and Dis ...

  3. ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  4. pat乙级 1017 A除以B 模拟除法

    #include <stdio.h> #define MAX_A 1000 int A[MAX_A]; int B; /* 除数 */ int num; /* A 被除数有多少位 */ v ...

  5. Linux学习之文件目录指令(部分)

    包括了 ls  pwd  cd  mkdir  rmdir  touch  cp  rm  mv  cat  echo  more  less  head  tail  >  >>指 ...

  6. TypeError: 'int' object is not subscriptable 报错

    Python中报错TypeError: 'int' object is not subscriptable 原因:整形数据中加了下标索引 例如 #python utf-8 a = 10 b = a[0 ...

  7. Oracle 查看表空间使用率

    SELECT Upper(F.TABLESPACE_NAME) "TablespaceName", D.TOT_GROOTTE_MB "Total(M)", D ...

  8. selenium模拟鼠标点击

    JAVA环境 WebElement button = driver.findElement(By.xpath("/html/body/div[1]/div[3]/h2/div[2]" ...

  9. 解决gpg: 从公钥服务器接收失败:服务器故障

    xxx@xxx-virtual-machine:~/workspace/rv1126_rv1109_sdk$ sudo apt-key adv --keyserver hkp://keyserver. ...

  10. Android集成mupdf,实现手写笔签字,手指翻页的java代码

    import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.RectF; import ...