【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 }
【RUNOOB】C语言学习之指针的更多相关文章
- c语言学习笔记 - 指针和字符串
前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...
- c语言学习笔记 - 指针和数组
结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多. #include <stdio.h> int mai ...
- c语言学习笔记.指针.
指针: 一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 声明: int *ptr; /* 一个整型的指针,指针指向的类型是整型 */ double *ptr; /* 一个 double 型 ...
- C语言学习之指针
指针这块,看了好久才有点头绪,稍微有点理解了. 一.指针申明以及赋值 int *p; 这样就声明了一个int型的指针p,这个p就是指针变量,可能上述的书写方式会混淆我们队指针的理解(*号) 我们可以这 ...
- C语言学习笔记--指针阅读技巧
1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复 2.3 步骤,直到阅读结束 注 ...
- C语言学习笔记--指针和数组的关系
1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译 ...
- C语言学习笔记--指针概念
指针也是一种变量,占有内存空间,用来保存内存地址,在32位系统中指针的占用的内存大小为4个字节 1.*号的意义 (1)在指针声明时,*号表示所声明的变量为指针 (2)在指针使用时,*号表示取指针所指向 ...
- C语言学习笔记--指针与字符串
字符类型 char(character)是一种整数,也是一种特殊的类型:字符.这是因为 ① 用单引号表示的字符字符字面量:‘a’,'1' ②‘’也是一个字符 ③printf和scanf里用%c来输入. ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- GO语言学习(十五)Go 语言指针
Go 语言指针 Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 接下来让我们来一步步学习 Go 语言指针. 我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地 ...
随机推荐
- [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
利用蛋白组学技术开发一项蛋白评分与临床参数联用可以增强对TNF拮抗剂对RA疗效的预测效能 Cuppen BV, et al. EULAR 2015. Present ID: OP0130. 背景: 对 ...
- .net 下SSE使用demo
所谓SSE,就是浏览器向服务器发送一个HTTP请求,然后服务器不断单向地向浏览器推送"信息"(message).这种信息在格式上很简单,就是"信息"加上前缀&q ...
- dotnet core 托管
1.托管形式 dotnet core的托管形式分为 进程内托管(InProcess).进程外托管 (OutOfProcess) 新建的Web程序csproj带有 <AspNetCoreHosti ...
- LeetCode-851 喧嚣与富有
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/loud-and-rich 题目描述 有一组 n 个人作为实验对象,从 0 到 n - 1 编号, ...
- 银河麒麟服务器V10-SP2安装tomcat
1.首先先去tomcat官网下载一个安装包 2.创建一个存放压缩包的文件夹,并考入文件 3.解压tomcat压缩包 命令: tar -xvf 压缩包名 4.启动tomcat 进入apache-tomc ...
- centos 修改ip
TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=staticDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6IN ...
- Windows常用快捷键(但我本人不太熟知的)
Shift+Ctrl+ESC: 打开任务管理器 Windows+E: 打开文件资源管理器 Windows+R: 运行文件 Windows+Tab: 切换应用程序 Shift+Delete: 永久删除
- Asp.NET core/net 5接口返回实体含有long/int64的属性序列后最后几位变为0的解决
Asp.NET core /net 5接口返回实体含有long/int64的属性时,序列后最后几位变为0的. 不得不吐槽一下MS,这种事还有问题,NND. 解决方案在startup.cs中添加:opt ...
- DotNetCore2.1镜像上传DockerHub在Docker运行
操作步骤: 1.本地安装Docker(此处省略安装过程) 2.登录Docker 3.浏览器打开官方DockerHub地址注册用户(注意:注册操作需要FQ才能成功,后期登录和其他操作使用国内网络都可以) ...
- Vue基础之v-if与v-show
Show Time! 说再多不如直接上效果: (一)v-if <div id="app"> <div v-if="flag" class=&q ...