资料来源:

(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. .Net Core 配置源码学习 (一)

    一 背景 相比.Net Framework , .NET Core的配置系统 ,有一些明显的优点 ,如: 1 支持更丰富的配置源 2 读取配置时, 可以用相同的方式读取, 并且非常方便 3 修改配置后 ...

  2. CCRD_TOC_2015_EULAR专刊第二辑

    中信国健风湿免疫临床通讯 EULAR2015专刊第2辑●目录   类风湿关节炎专题 ■ RA放射学进展的预测 OP0070 滑膜HIF-1a与RA关节破坏 THU0085 24周SDAI缓解能否预测R ...

  3. vue---:click、:class可以这样表示

    1.:class (1)是否选用class :class="{'active':item.id == id}" (2)根据条件,当前数据dealerId中是否包含当前id,有用cl ...

  4. err has no member, has initializer but incomplete type

    原因:没有头文件

  5. 奇迹网站编辑保存的时候提示Access is denied

    出现上面这个情况 只有在IIS模式下运行奇迹MU网站系统才会出现这个问题. 解决办法: 给网站目录赋予everyone权限 1.在网站目录右键属性 2在文件夹属性界面,点击"安全" ...

  6. 制造业常用KPI

    1.  质量KPI CA (Capability of Accuracy): 平均值距离期望中心值的距离,值越大,说明平均值越接近期望中心值. Ca=(X-U)/(T/2) CP (Capabilit ...

  7. 第三章-标准SQL语句

    3.1 SQL概述: SQL:结构化查询语言,是关系数据库的标准语言,SQL是一个通用的.功能极强的关系数据库语言 结构化查询:理解:就是只要告诉数据库我要干什么,怎么干就可以了 3.1.2 SQL的 ...

  8. 数值分析之数值积分 4.X

    求积公式 \[\int_{a}^{b} f(x) \mathrm{d} x \approx \sum_{k=0}^{n} A_{k} f\left(x_{k}\right) \] \(A_k\) 为求 ...

  9. UE打LOG整理

    Kismet库 蓝图方法cpp使用 例:打LOG:Print String 蓝图节点的鼠标tips:Target is Kismet System Library #include "Run ...

  10. C语言中static关键字用法

    概述 static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护. 在程序中使用static 变量 1. 局部变量 普通局部变量是再熟悉不过的变量了,在任何一个函数内 ...