C語言數組應用

一、數組的內存布局

先看下面的例子:
? ?int a[5];
所有人都明白這里定義了一個數組,其包含了5 個int 型的數據。我們可以用a[0],a[1]等來訪問數組里面的每一個元素,那么這些元素的名字就是a[0],a[1]…嗎?看下面的示意圖:

如上圖所示,當我們定義一個數組a 時,編譯器根據指定的元素個數和元素的類型分配確定大小(元素類型大小*元素個數)的一塊內存,并把這塊內存的名字命名為a。名字a 一旦與這塊內存匹配就不能被改變。a[0],a[1]等為a 的元素,但并非元素的名字。數組的每一個元素都是沒有名字的。那現在再來回答第一章講解sizeof 關鍵字時的幾個問題:
? ?sizeof(a)的值為sizeof(int)*5,32 位系統下為20。
? ?sizeof(a[0])的值為sizeof(int),32 位系統下為4。
sizeof(a[5])的值在32 位系統下為4。并沒有出錯,為什么呢?我們講過sizeof 是關鍵字不是函數。函數求值是在運行的時候,而關鍵字sizeof 求值是在編譯的時候。雖然并不存在a[5]這個元素,但是這里也并沒有去真正訪問a[5],而是僅僅根據數組元素的類型來確定其值。所以這里使用a[5]并不會出錯。

sizeof(&a[0])的值在32 位系下為4,這很好理解。取元素a[0]的首地址。

sizeof(&a)的值在32 位系統下也為4,這也很好理解。取數組a 的首地址。但是在VisualC++6.0 上,這個值為20,我認為是錯誤的。

二、省政府和市政的區別----&a[0]和&a 的區別

這里&a[0]和&a 到底有什么區別呢?a[0]是一個元素,a 是整個數組,雖然&a[0]和&a的值一樣,但其意義不一樣。前者是數組首元素的首地址,而后者是數組的首地址。舉個例子:湖南的省政府在長沙,而長沙的市政府也在長沙。兩個政府都在長沙,但其代表的意義完全不同。這里也是同一個意思。

三、數組名a 作為左值和右值的區別

簡單而言,出現在賦值符“=”右邊的就是右值,出現在賦值符“=”左邊的就是左值。比如,x=y。

左值:在這個上下文環境中,編譯器認為x 的含義是x 所代表的地址。這個地址只有編譯器知道,在編譯的時候確定,編譯器在一個特定的區域保存這個地址,我們完全不必考慮這個地址保存在哪里。
右值:在這個上下文環境中,編譯器認為y 的含義是y 所代表的地址里面的內容。這個內容是什么,只有到運行時才知道。

C 語言引入一個術語-----“可修改的左值”。意思就是,出現在賦值符左邊的符號所代表的地址上的內容一定是可以被修改的。換句話說,就是我們只能給非只讀變量賦值。

既然已經明白左值和右值的區別,下面就討論一下數組作為左值和右值的情況:
當a 作為右值的時候代表的是什么意思呢?很多書認為是數組的首地址,其實這是非常錯誤的。a 作為右值時其意義與&a[0]是一樣,代表的是數組首元素的首地址,而不是數組的首地址。這是兩碼事。但是注意,這僅僅是代表,并沒有一個地方(這只是簡單的這么認為,其具體實現細節不作過多討論)來存儲這個地址,也就是說編譯器并沒有為數組a分配一塊內存來存其地址,這一點就與指針有很大的差別。

a 作為右值,我們清楚了其含義,那作為左值呢?

a 不能作為左值!這個錯誤幾乎每一個學生都犯過。編譯器會認為數組名作為左值代表的意思是a 的首元素的首地址,但是這個地址開始的一塊內存是一個總體,我們只能訪問數組的某個元素而無法把數組當一個總體進行訪問。所以我們可以把a[i]當左值,而無法把a當左值。其實我們完全可以把a 當一個普通的變量來看,只不過這個變量內部分為很多小塊,我們只能通過分別訪問這些小塊來達到訪問整個變量a 的目的。

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

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

相關文章

Installation failed, deleting ./composer.json.安裝phpunit報錯解決方案

是因為你沒有裝全局的phpunit,安裝命令 composer global require phpunit/phpunit 之后你輸入 composer require --dev phpunit/phpunit 就發現你安裝成功了

MyBatis在Oracle中插入數據并返回主鍵的問題解決

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 前言:我早期用過這個方法,但是返回的依舊是影響行數,不是主鍵。 只是這種寫法可以達到我要的效果&a…

在 Intellij IDEA 里使用 OpenJFX (JavaFX)

2019獨角獸企業重金招聘Python工程師標準>>> JDK 11 把 JavaFX 剝離了出來,形成了單獨且開源的 OpenJFX 模塊。 本文的目的是通過簡單的例子解釋這一變化對使用 JavaFX 所造成的影響,并找到一種在 IDEA 2018.2 上使用它的辦法。 首先&#xf…

使用phpunit新建項目

1、mkdir test-project 新建一個test-project 2、cd test-project 跑到文件夾中 3、實例化git git init 4、新建phpunit項目 composer require --dev phpunit/phpunit 5、使用gi實例化.gitignore gi composer>.gitignore (如果沒有安裝gi,請使用命令ec…

如何解決eclipse里面tomcat 8080端口被占用

很多時候運行tomcat 的時候總是會提示tomcat 的端口被占用 但是任務管理器里面還找不到是哪個端口被占用了 因此很多人就重新配置tomcat 或者去修改tomcat的端口號 ,其實這么做太麻煩了 ,小弟在這里告訴你一個非常簡單的方法。 1.在開始菜單中選擇運行 …

Selenium UI 舉例 getCssValue

selenium jar包中,在WebElement的接口中, String getCssValue(String var1);可以通過標簽,獲取對應的css值。具體要怎么用呢,如下: WebElement baidu driver.findElement(By.id("su"));su.getCssValue(&quo…

java集合框架中contains(),containsKey()和containsValue()的用法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 java集合框架中contains(),containsKey()和containsValue()的用法: List集合的contains()方法用于判斷集合中包不包含某個元…

敏捷視頻

規模化極限編程的關鍵抓手:驗收條件https://mp.weixin.qq.com/s/aHlSxpMx7DTQXaoEgcAQ3g 5分鐘讓你子解持續集成https://www.bilibili.com/video/BV1SK411W77W/?spm_id_fromtrigger_reload 5分鐘讓你學會返工率降低1倍的神技--開卡、驗卡https://www.bilibili.com/…

提問的智慧

提問的智慧轉載于:https://www.cnblogs.com/whigym/p/10028642.html

C語言指針和數組概述

幾乎每次講課講到指針和數組時,我總會反復不停的問學生:到底什么是指針?什么是數組?他們之間到底是什么樣的關系。從幾乎沒人能回答明白到幾乎都能回答明白,需要經歷一段“慘絕人寰”的痛。指針是C/C的精華&#xff0c…

Linux tee的花式用法和pee

1.tee多重定向 tee [options] FILE1 FILE2 FILE3... tee的作用是將一份標準輸入多重定向,一份重定向到標準輸出/dev/stdout,然后還將標準輸入重定向到每個文件FILE中。 例如: $ cat alpha.log | tee file1 file2 file3 | cat $ cat alpha.log…

[CF893F]Subtree Minimum Query

題目大意: 給你一顆有根樹,點有權值,m次詢問,每次問你某個點的子樹中距離其不超過k的點的權值的最小值。(邊權均為1,點權有可能重復,k值每次詢問有可能不同,強制在線) 做…

mac電腦快捷鍵(持續更新)

1、快速查找軟件 commandspace 2、顯示/隱藏文件夾 shiftcmmand. 3、路徑輸入 commandshiftg 4、快速打開軟件 commandtab 5、截圖 commandshift3 commandshift4 6、注銷 Command-Shift-Q 7、強制注銷 ommand-Shift-Option-Q 8、睡眠 controlshift電源鍵 9、選…

C語言typedef關鍵字—偉大的縫紉師

關于馬甲的笑話。有這樣一個笑話:一個獵人在河邊抓捕一條蛇,蛇逃進了水里。過一會,一個烏龜爬到岸邊。獵人一把抓住這個烏龜,大聲的說道:小樣,別你為你穿了個馬甲我就不認識你了!typedef 關鍵字…

將網橋的配置寫進去/etc/sysconfig/network-scripts/ifcfg-xxx

有時候需要使用網橋命令比如brctl設置一些網橋的屬性,而這些方式能否同樣寫進去配置文件使其永久開機生效。 答案是不行的,也同樣找過Ubuntu的,其實Ubuntu可以實現,參考:http://manpages.ubuntu.com/manpages/cosmic/m…

phpstorm如何回滾。并取消本地提交

1、現在我提交到本地 當前git版本為4b53dca9 上一版本為965cdf14 2、現在執行回滾操作,取消本地提交 版本復制到這里,點擊reset就會回滾了 如需使用git命令操作,請參考鏈接https://blog.csdn.net/qq_35774849/article/details/107313193

windows server 2008 R2 x64 基礎知識(2)

一、防火墻設置 1.windows防火墻的種類: 1)工作組網絡環境 2)域網絡環境 2.防火墻的配置 1)打開管理工具:win->管理工具->高級安全windows防火墻 2)管理配置: (1)防火墻的數據流類型 a.入站流量:外部訪問內部分流量 b…

SOA 說明,解析

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一直對SOA這個概念不甚明了,再度記錄下: 一、是一個面向服務的架構,是一種思想、規則。而不是一個確…

Windows API 第二篇 SHGetSpecialFolderPath

BOOL SHGetSpecialFolderPath( HWND hwndOwner, LPTSTR lpszPath, int nFolder, BOOL fCreate ); 參數解釋: hwndOwner:Handle to the owner wind…

面向對象—的__new__()方法詳解

[Python] Python 之 __new__() 方法與實例化 __new__() 是在新式類中新出現的方法,它作用在構造方法建造實例之前,可以這么理解,在 Python 中存在于類里面的構造方法 __init__() 負責將類的實例化,而在 __init__() 啟動之前&#…