探索 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语言中指针占据内存空间问题
以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...
随机推荐
- go操作Kfaka
目录 1. Kafka介绍 1.1.1. Kafka是什么 1.1.2. Kafka的特点 1.1.3. 常用的场景 1.1.4. Kafka中包含以下基础概念 1.1.5. 消息 1.1.6. 消息 ...
- Windows10下python3和python2同时安装(一)安装python3和python2
Windows10下python3和python2同时安装(一) 安装python3和python2 特别说明,本文是在Windows64位系统下进行的,32位系统请下载相应版本的安装包,安装方法类似 ...
- js迭代循环
一.for loop for (let i = 0; i < products.length; i++) { console.log(products[i]); } 支持循环中断,可以用brea ...
- STM32点亮LED的代码
led.c #include "led.h" void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2P ...
- python 错误之TypeError: XXXXX() takes no keyword arguments
举个例子: str1 = 'sunlightn' f = str1.rfind("n", __start=1, __end=2) print(f) 以上代码运行后出现: " ...
- python 中变量的命名规则与注释
变量命名规则 1.变量名必须是大小写英文字母.数字或下划线 _ 的组合,不能用数字开头,并且对大小写敏感 2.关键字不能用于命名变量,关键字一共有35个,以下为关键字的获取 注释 代码注释提高了代码的 ...
- ubunut安装qtcreater
安装gcc 1 kxb@kxb:~$ gcc -v 2 3 Command 'gcc' not found, but can be installed with: 4 5 sudo apt insta ...
- RSA非对称加密算法浅析
说起加密算法,大的分类上,常规区分通常会区分为对称加密与非对称加密两种,两种算法都各有优缺点.然而互联网发展到今天,应用更广的还是非对称加密的方式,而非对称加密中,RSA又首当其中,被广泛运用到各类应 ...
- 创建型模式 - 原型模式Prototype
孩子生来没娘的NT审核机制,又开始说我涉及到广告了,我涉及到什么广告了?我接着发. 学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 所属:创建型模式 原型模式 一般会和 工场 ...
- UML 图
类的表示(Class) 第一层:显示类的名称,如果是抽象类,则就用斜体显示. 第二层:是类的特性,通常就是字段和属性. 第三层:是类的操作,通常是方法或行为(前面加号(+)表示public:减号(-) ...