修改本地局部变量的值——指针的应用(1)

问题描述:使用指针通过函数改变函数调用处本地局部变量的值。

解题思路:
1.在main()函数内部定义一个局部变量并赋给其初值;
2.输出该局部变量的值,便于与后面的输出进行比较;
3.定义一个函数func()用于实现更改局部变量的值,为了能够在func()函数中改变局部变量的值,应该告诉函数该局部变量的地址,于是用 “&局部变量名” 作为函数的实参;
4.输出更改之后的结果,自行比较。

完整代码:

/*问题:使用指针通过函数改变函数调用处本地局部变量的值
    Written by : Jimmy Tung
    Date :2020.04.08
*/
#include <stdio.h>
#include <stdlib.h>

void func( int * ); //改变本地局部变量的值

int main(void)
{
    int i;
    i = 520;
    printf("更改前i = %d\n", i); //输出更改之前的值
    func( &i );
    printf("更改后i = %d\n", i); //输出更改之后的值

    system("PAUSE");
    return 0;
}

void func( int *ptr_i)
{
    *ptr_i = 3344;
}

结果如下:

更改前i = 520
更改后i = 3344
请按任意键继续. . .

Process returned 0 (0x0)   execution time : 7.259 s
Press any key to continue.

要点复盘:

  1. 一元运算符“&”的作用:
    由代码可以知道,&i 这个表达式是一个指针类型的量,因为在func()函数中,形参的类型是“int *”型,C中要求实参与形参的类型要一致,故 &i 是一个 int *类型的指针。从这里可以看出,一元运算符“&”的作用是求一个指向i这个内存区域(i的左值含义)的指针。
    这里自然而然要提到一个问题,那么既然&i是一个指针类型的量,那它是变量还是常量呢?
    它是一个常量,准确来说,它是一个int *类型的指针常量。这是因为&i既不能通过代码赋值,也不能通过代码而被改变,在编译器编译之前,我们不可能知道编译器会把哪一部分内存区域分配给局部变量i,因而是一个常量(可以测试一下)。

2.func()函数的实现
func()函数从主函数中获得指向了局部变量i的指针常量&i,因而只要对&i进行求内存运算就可以找到局部变量i的内存地址,对其进行更改操作。对这个函数进行分析,大致可以知道其主要完成了三件事情:
(1)从主调函数那里接收了指针变量&i并存储起来;
(2)根据&i求出局部变量i的内存地址;
(3)修改局部变量的值。
我们仔细对(1)这件事情进行剖析,即对下面这个语句(函数调用语句)进行分析:

func( &i );

首先计算&i的值。这一步是由机器完成的,以下用我的机器显示一下实参的值为,可以看出这是一个内存单元的编号,也就是说&i这个指针常量的值是一个内存单元编号。

&i = 0028FF1C
请按任意键继续. . .

把计算得到的实参的值赋给形参作为初值,也就是以下操作:

ptr_i = &i;

此时,ptr_i这个指针的含义是指向局部变量i(左值)的指针,这块内存区域的大小为sizeof(int)。这个指针的值(右值)就是0x0028FF1C,即局部变量i占有的的第一个内存单元的编号。到此,第(1)件事情做完了。

第(2)件事情是本函数的关键,因为其用实参和形参类型提供的信息求出了局部变量的内存地址,这样才能对局部变量进行修改。这件事情是由一元运算符“ * ”实现的,这个运算符的运算对象是指针,运算结果是指针所指向的那块内存(左值)或者是那块内存中所存放的值(右值)。故 *ptr_i有两个含义,这是C中的一大特点——一词多义。
从本例题可以总结出,&运算符是用左值表达式(内存)计算出指针,而 *运算符是用指针计算出内存。两个运算符互为逆运算符(referencing and dereferencing operator)。

第(3)件事就非常简单了,用以下语句就可以实现。

*ptr_i = 3344;

从对第(2)件事的分析和代码,ptr_i其实就是(&i),而*和&互逆,于是我们很容易得到 *(&i)就是局部变量i。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容