探索 C 语言的指针
指针的概念
指针代表一个变量的内存地址,通过&可以拿到变量的内存地址。变量不等于指针,通过*可以拿到指针所指向的变量的值。

在 C 中,存在指针变量,指针变量的声明格式:int* varName = &varAddress。声明指针变量之后,通过*可以拿到该指针变量所指向的值。例如,feet 变量是一个int类型,指针变量的类型也是int。
int main(void)
{
  int feet = 10; // int 类型的变量
  int* pfeet = &feet; // 指针变量,与 feet 数据类型一样
  printf("before updating feet is %d\n", feet); // before updating feet is 10
  *pfeet += 10; // 通过 * 拿到指针变量所指向的值
  printf("now feet is %d\n", feet); // now feet is 20
  return 0;
}
指针的作用
因为函数作用域的影响,局部变量只能存在于一个函数作用域内使用,一个函数传递它的局部变量给另一个函数,这个变量的地址会变化,也就是变量不是同一个。如果想“穿透”作用域带来的这种限制,考虑使用指针。
void change(int, int); // 声明一个函数
int main(void)
{
  int x = 10, y = 5; // 声明 main 函数的局部变量
  change(x, y); // 传递局部变量,main 函数的 x、y 和 change 的 x、y 地址不相同
  printf("[3] x = %d, y = %d\n", x, y);
  return 0;
}
void change(int x, int y)
{
  printf("[1] x = %d, y = %d\n", x, y);
  x = 20;
  y = 10;
  printf("[2] x = %d, y = %d\n", x, y);
}
在 main 函数中声明的两个局部变量,change 函数的变量由 main 传递,但实际上 x 和 y 的地址都不一样。main 函数修改 x 或 y,不会影响 change 函数内的 x 或 y。而传递指针,就能够穿透“作用域”,改变上述问题。

指针指向的是内存地址,只要拿到内存地址,找到门牌号,就能修改变量的值。下面通过指针来修改 main 函数的 x 和 y:
void change(int*, int*); // 声明指针变量,传递变量的内存地址
int main(void)
{
  int x = 10, y = 5;
  change(&x, &y); // 传递内存地址,而不是变量
  printf("[3] x = %d, y = %d. x Address = %p, y Address = %p\n", x, y, &x, &y);
  return 0;
}
void change(int* x, int* y)
{
  printf("[1] x = %d, y = %d. x Address = %p, y Address = %p\n", *x, *y, x, y);
  *x = 20;
  *y = 10;
  printf("[2] x = %d, y = %d. x Address = %p, y Address = %p\n", *x, *y, x, y);
}
change 函数接收的是一个指针,函数找到内存地址所对应的变量(通过*拿到内存所指向的变量值),修改其指针所指向的变量值,main 函数的 x 和 y 也随着改变:

探索 C 语言的指针的更多相关文章
- 浅谈c语言的指针
		
对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...
 - C#委托与C语言函数指针及函数指针数组
		
C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...
 - C语言二重指针与malloc
		
(内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include &l ...
 - C语言函数指针基础
		
本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...
 - 为什么C/C++语言使用指针
		
这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的 ...
 - C语言的指针变量
		
C语言的指针变量 在C语言中,变量是固定范围的存储空间,它存储的是赋给他的值, 比如: ; /* 这里是定义一个整型变量a,并把12这个值存储在a的地址空间上 这个地址空间是系统随机分配的,对用户是透 ...
 - Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
		
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
 - “对外部(局部)变量的访问”是C语言函数指针的最大弱点
		
1.“对外部(局部)变量的访问”是C语言函数指针的最大弱点 . #include <stdio.h> #include <stdlib.h> /* 结构体定义 */ struc ...
 - go语言学习--指针的理解
		
Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, fu ...
 - C语言中指针占据内存空间问题
		
以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...
 
随机推荐
- JavaEE Day13 Tomcat和Servlet
			
之前是web基础,现在是web核心 今日内容: web相关概念的回顾 开源的web服务器软件:Tomcat Servlet:整个web技术的核心[Servlet入门] 一.web相关概念的回顾 1.软 ...
 - TransmittableThreadLocal和@Async优雅的记录操作日志
			
此文主要讲解: 如何实现操作记录 如何将TransmittableThreadLocal和@Async搭配使用 TransmittableThreadLocal阿里的一个开源组件,为了在使用线程池等会 ...
 - SpringBoot源码2——SpringBoot x Mybatis 原理解析(如何整合,事务如何交由spring管理,mybatis如何进行数据库操作)
			
阅读本文需要spring源码知识,和springboot相关源码知识 对于springboot 整合mybatis,以及mybatis源码关系不密切的知识,本文将简单带过 系列文章目录和关于我 涉及到 ...
 - Python全栈工程师之从网页搭建入门到Flask全栈项目实战(7) - 在线问答系统
			
1.项目源码/业务逻辑 百度网盘链接:链接:https://pan.baidu.com/s/13VNfrSJE6vcL3HP1J5T8ew 提取码:00s0,项目业务逻辑自行阅读 2.项目搭建 点击新 ...
 - RabbitMQ、RocketMQ、Kafka延迟队列实现
			
延迟队列在实际项目中有非常多的应用场景,最常见的比如订单未支付,超时取消订单,在创建订单的时候发送一条延迟消息,达到延迟时间之后消费者收到消息,如果订单没有支付的话,那么就取消订单. 那么,今天我们需 ...
 - JavaScript:七大基础数据类型:字符串string
			
在JS中,字符串类型的数据,有三种表达方式,但是无一例外都是需要引号扩起来的: 单引号'hello' 双引号"hello" 反引号`hello` 注意: 因为JS没有字符类型,这一 ...
 - 12、HSSFWorkbook实现多张sheet导出
			
转载自 一.封装一个通用的装载数据的实体类: import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsCon ...
 - 3、swagger-ui导出word接口文档
			
参考 1.修改swagger2word项目的 application.yml 文件的 swagger.url 为Swagger Json资源的url地址(网址+端口): 例:swagger.url: ...
 - idea 函数名灰色
			
idea被引用的方法名突然全部灰掉了 idea被引用的方法名突然全部灰掉了[已解决]_weixin_42554373的博客-CSDN博客_idea方法名灰色
 - vulnhub靶场之FUNBOX: UNDER CONSTRUCTION!
			
准备: 攻击机:虚拟机kali.本机win10. 靶机:Funbox: Under Construction!,下载地址:https://download.vulnhub.com/funbox/Fun ...