變量名和變量地址

變量名和變量地址

?

研一時,很偶然的翻開譚浩強老先生的《C程序設計》(是師姐的書,俺的老早就賣了,估計當時覺得這本書寫得不夠好),很偶然的看到關于變量名的一段話:“變量名實際上是一個符號地址,在對程序編譯連接時由系統給每一個變量名分配一個內存地址。在程序中從變量中取值,實際上是通過變量名找到相應的內存地址,從其存儲單元中讀取數據。

當時很震驚上課的時候居然沒有發現這句蠻有深意的話語,可是研一的時候還是沒有完全明白,只是知道有這么幾個東西:變量名、內存地址、變量值。后來看到指針的地方,說到了“符號表”的這個東東,就更頭大了。符號表到底是個什么樣子?那個變量名到底放在內存的什么地方?

最近在寫驅動,面對的是一個芯片手冊,幾百個寄存器。現在來看,才發現其實還是蠻簡單的。

?

芯片手冊大概是這么寫的:

地址

名稱

0x00

CHIP_ID

0x03

0x01

CHIP_VERSION

0xA2

0x02

……

……

0x03

?

?

?

那么,“符號表”其實就是“名稱”的那一列,把所有的名稱放在一起就是一個符號表了嘛。

“通過變量名找到內存地址”也很簡單,比如說定義一個宏:#define CHIP_ID_ADDR?????? 0x00就可以了。

read函數可以這么寫:

xxx_read_val(addr, retval)

{

?????? retval = *addr;

}

調用的時候也很容易:

xxx_read_val(CHIP_ID_ADDR,&val);

這也可以算是所謂的“通過變量名找到內存地址,,從其存儲單元中讀取數據了。”

那么,比如說定義一個char a = ‘P’;

編譯時會為a分配一個地址,是把a和P填在表上,就是:

?

地址

名稱

0x00

CHIP_ID

0x03

0x01

CHIP_VERSION

0xA2

0x02

a

0x50

0x03

……

……

?

?

?

?

/*在對程序編譯連接時由編譯系統給每一個變量名分配對應的內存地


址,該地址分配后不可改變,直到該空間被釋放*/


#include <iostream.h>
void main()
{
int val1 = 10, val2 = 20;
int temp;

cout << "Before swap, val1 =" << val1 << " ?" <<?


"val2 =" << val2 << endl;
cout << "Before swap, val1 =" << &val1 << " ?" <<?


"val2 =" << &val2 << endl;


temp = &val1; ? //錯誤:改變了變量的內存地址
&val1 = &val2;
&val2 = temp;

cout << "After swap, val1 =" << val1 << " ?" <<?


"val2 =" << val2 <<endl;
cout << "After swap, val1 =" << &val1 << " ?" <<?


"val2 =" << &val2 <<endl;

}

?

報錯error C2106: '=' : left operand must be l-value

解釋:賦值號(‘=’)左邊的操作數必須是一個左值。通俗的說:左值就是可以改變值的變量。

發生這個錯誤的原因是你把常量(或不可改變值的變量)放到了賦值號的左邊。此處就是因為變量val1,val2的地址是不可改變的量,才導致出錯。

?

轉載于:https://www.cnblogs.com/lsgxeva/p/7778528.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390923.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390923.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390923.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多重插補 均值插補_Feature Engineering Part-1均值/中位數插補。

多重插補 均值插補Understanding the Mean /Median Imputation and Implementation using feature-engine….!了解使用特征引擎的均值/中位數插補和實現…。&#xff01; 均值或中位數插補&#xff1a; (Mean or Median Imputation:) The mean or median value should be calc…

域 嵌入圖像顯示不出來_如何(以及為什么)將域概念嵌入代碼中

域 嵌入圖像顯示不出來Code should clearly reflect the problem it’s solving, and thus openly expose that problem’s domain. Embedding domain concepts in code requires thought and skill, and doesnt drop out automatically from TDD. However, it is a necessary …

linux 查看用戶上次修改密碼的日期

查看root用戶密碼上次修改的時間 方法一&#xff1a;查看日志文件&#xff1a; # cat /var/log/secure |grep password changed 方法二&#xff1a; # chage -l root-----Last password change : Feb 27, 2018 Password expires : never…

spring里面 @Controller和@RestController注解的區別

問題&#xff1a;spring里面 Controller和RestController注解的區別 spring里面 Controller和RestController注解的區別 Web MVC和REST applications都可以用Controller嗎&#xff1f; 如果是的話&#xff0c;怎么樣區別這個一個 Web MVC還是REST application呢 回答一 下面…

2流程控制

分支、循環 str1$1 str2$2 echo $# if [ $str1 $str2 ] thenecho "ab" elif [ "$str1" -lt "$str2" ] thenecho "a < b" elif [ "$str1" -gt "$str2" ] thenecho "a > b" elseecho "沒有符…

客戶行為模型 r語言建模_客戶行為建模:匯總統計的問題

客戶行為模型 r語言建模As a Data Scientist, I spend quite a bit of time thinking about Customer Lifetime Value (CLV) and how to model it. A strong CLV model is really a strong customer behavior model — the better you can predict next actions, the better yo…

linux bash命令_Ultimate Linux命令行指南-Full Bash教程

linux bash命令Welcome to our ultimate guide to the Linux Command Line. This tutorial will show you some of the key Linux command line technologies and introduce you to the Bash scripting language.歡迎使用我們的Linux命令行最終指南。 本教程將向您展示一些關鍵…

【知識科普】解讀閃電/雷電網絡,零基礎秒懂!

知識科普&#xff0c;解讀閃電/雷電網絡&#xff0c;零基礎秒懂&#xff01; 閃電網絡的技術是革命性的&#xff0c;將實現即時0手續費的小金額支付。第一步是解決擴容問題&#xff0c;第二部就是解決共通性問題&#xff0c;利用原子交換協議和不同鏈條的狀態通道結合&#xff…

spring框架里面applicationContext.xml 和spring-servlet.xml 的區別

問題&#xff1a;spring框架里面applicationContext.xml 和spring-servlet.xml 的區別 在Spring框架中applicationContext.xml和Spring -servlet.xml有任何關系嗎? DispatcherServlet可以使用到在applicationContext.xml中聲明的屬性文件嗎? 另外&#xff0c;為什么我需要*…

Alpha 沖刺 (5/10)

【Alpha go】Day 5&#xff01; Part 0 簡要目錄 Part 1 項目燃盡圖Part 2 項目進展Part 3 站立式會議照片Part 4 Scrum 摘要Part 5 今日貢獻Part 1 項目燃盡圖 Part 2 項目進展 已分配任務進度博客檢索功能&#xff1a;根據標簽檢索流程圖 -> 實現 -> 測試近期比…

多維空間可視化_使用GeoPandas進行空間可視化

多維空間可視化Recently, I was working on a project where I was trying to build a model that could predict housing prices in King County, Washington — the area that surrounds Seattle. After looking at the features, I wanted a way to determine the houses’ …

蠻力寫算法_蠻力算法解釋

蠻力寫算法Brute Force Algorithms are exactly what they sound like – straightforward methods of solving a problem that rely on sheer computing power and trying every possibility rather than advanced techniques to improve efficiency.蠻力算法聽起來確實像是–…

NoClassDefFoundError和ClassNotFoundException之間有什么區別?是由什么導致的?

問題&#xff1a; NoClassDefFoundError和ClassNotFoundException之間有什么區別?是由什么導致的&#xff1f; NoClassDefFoundError和ClassNotFoundException之前的區別是什么? 是什么導致它們被拋出?這些問題我們要怎么樣解決? 當我在為了引入新的jar包而修改現有代碼…

關于Tensorflow安裝opencv和pygame

1.安裝opencv https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv C:\ProgramData\Anaconda3\Lib\site-packages>pip install opencv_python-3.3.1-cp36-cp36m-win_amd64.whlProcessing c:\programdata\anaconda3\lib\site-packages\opencv_python-3.3.1-cp36-cp36m-win_a…

內置的常用協議實現模版

SuperSocket內置的常用協議實現模版 中文&#xff08;中國&#xff09;Toggle Dropdownv1.6Toggle Dropdown關鍵字: TerminatorReceiveFilter, CountSpliterReceiveFilter, FixedSizeReceiveFilter, BeginEndMarkReceiveFilter, FixedHeaderReceiveFilter 閱讀了前面一篇文檔之…

機器學習 來源框架_機器學習的秘密來源:策展

機器學習 來源框架成功的機器學習/人工智能方法 (Methods for successful Machine learning / Artificial Intelligence) It’s widely stated that data is the new oil, and like oil, data needs the right refinement to evolve to be utilised perfectly. The power of ma…

linux gcc 示例_最好的Linux示例

linux gcc 示例Linux is a powerful operating system that powers most servers and most mobile devices. In this guide, we will show you examples of how to use some of its most powerful features. This involves using the Bash command line.Linux是功能強大的操作系…

帆軟報表和jeecg的進一步整合--ajax給后臺傳遞map類型的參數

下面是頁面代碼&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <%include file"/context/mytags.jsp"%> <% String deptIds (String)request.getAttribute("…

@Nullable 注解的用法

問題&#xff1a;Nullable 注解的用法 我看到java中的一些方法聲明為: void foo(Nullable Object obj){…}在這里Nullable是什么意思?這是不是意味著輸入可以為空? 沒有這個注解&#xff0c;輸入仍然可以是null&#xff0c;所以我猜這不是它的用法? 回答一 它清楚地說明…

WebLogic調用WebService提示Failed to localize、Failed to create WsdlDefinitionFeature

在本地Tomcat環境下調用WebService正常&#xff0c;但是部署到WebLogic環境中&#xff0c;則提示警告&#xff1a;[Failed to localize] MEX0008.PARSING_MDATA_FAILURE<SOAP_1_2 ......警告&#xff1a;[Failed to localize] MEX0008.PARSING_MDATA_FAILURE<SOAP_1_1 ..…