簡體   English   中英

C語言中變量和數據對象的區別?

[英]Difference between variable and data object in C language?

我正在閱讀 C Primer Plus 並遇到以下我無法理解的行-

指針? 他們是什么? 基本上,指針是一個變量(或者,更一般地說,是一個數據對象),其值是一個內存地址。

僅供參考,我之前遇到過這些行-

考慮一個賦值語句。 它的目的是在內存位置存儲一個值。 數據對象是可用於保存值的數據存儲區域的總稱。 C 標准僅使用術語對象來表示此概念。 識別對象的一種方法是使用變量的名稱。

我試過谷歌搜索但找不到任何東西。這些基本術語讓我感到困惑,所以請幫助我理解這些術語。

數據對象是存儲程序使用的信息的內存位置。

變量是程序中用來引用數據對象的名稱。

所以如果你寫:

int a;

它告訴編譯器創建一個可以容納整數的數據對象,並且在程序中您可以使用名稱a來訪問該數據對象。

指針是一個數據對象,其值是某個其他數據對象在內存中的位置。 所以如果你這樣做:

int *pa = &a;

要創建一個變量pa是指一個數據對象,其內容是數據的地址對象創建作為的結果, a變量聲明。

在 C 中,對象是任何占用存儲空間的東西。 C 2011在線稿

3. 術語、定義和符號
...
3.15
1 個對象
執行環境中的數據存儲區域,其內容可以表示值

左值是一個表達式,它指定一個對象,以便可以讀取或修改該對象的內容(基本上,任何可以作為賦值目標的表達式都是左值)。 雖然 C 標准沒有定義術語variable ,但您基本上可以將其視為指定對象的任何標識符:

int var;

標識符var指定一個存儲整數值的對象; 表達式var是一個左值,因為您可以通過它讀取和/或修改對象:

var = 10;
printf( "%d\n", var );

指針是其值是對象位置的任何表達式。 指針變量是存儲指針值的對象。

int *p = &var;

標識符p指定一個存儲整數對象位置的對象。 表達式&var計算結果為對象var的位置(地址)。 不是左值; 它不能是賦值的目標(你不能更新對象的地址)。 一元&運算符的操作數必須是左值。 表達式p OTOH一個左值,因為您可以為其分配一個新值:

int y = 1;
p = &y;
printf( "%p\n", (void *) p );  // one of the few places in C you need to cast a void pointer

表達式*p指定p指向的對象(在本例中為y )。 它也是一個左值,因為您可以通過它分配給對象:

*p = 5;  // same as y = 5
printf( "%d\n", *p );

所以基本上:

  • varpy是變量(指定對象的標識符)
  • varp*py是左值(可以讀取或修改對象的表達式)
  • &var , p , &p &y是指針表達式(值是對象位置的表達式)
  • p是指針變量(存儲指針值的對象)

你已經有了答案,但如果你想要:

變量:變量可以被認為是為引用您實際對象的持有者分配的名稱,因此當我們說 int x 時,它就像一個不引用任何內容(c 中的垃圾值)的占位符,但是當我們說 int x=10 時; 它用值 10 初始化 x(現在它引用 int 類型的數據對象,在這種情況下,數據對象的名稱將由編譯器本身維護),我們可以使用名稱 x 來訪問值 10。

數據對象:正如您所引用的“數據對象是可用於保存值的數據存儲區域的通用術語。” 即。 記憶位置

指針:基本上,指針就像存儲值的變量,而不是存儲實際值(如 int、float、char ..),它們保存存儲實際值的內存位置的地址,即對數據對象的引用。

“所以當你說 int x 時,你說聲明一個名為 x 的占位符,當你說 int *x 時,你說聲明一個名為 x 的占位符,它可以保存對 int 類型的引用。”

數據對象是存儲數據的對象,我們計算機中的數據對象是Ram中的寄存器。 每個寄存器都有一個地址位置。 寄存器具有 read_lock 和 write_lock 機制。 在這些寄存器中,您可以存儲變量數據和常量數據。 可變數據意味着它可以在整個過程中修改。 意味着,保存變量數據的 Data 對象稱為變量。 變量 read_lock 和 write_lock 被禁用。 這就是為什么您可以在整個過程中修改變量(變量數據對象)的原因。 要識別變量數據對象,您需要為其聲明一個名稱。 例如:int 速度:= 60; 這里的速度是一個變量(變量數據對象),它的大小是 4 個字節。 它只保存整數數據。 變量中的數據在其整個應用過程中是可變的。

在數據對象中,如果您存儲常量數據,則這些數據對象稱為常量。 對於常量數據對象,rd_lock 被禁用,但 write_lock 被啟用。 這就是為什么您可以讀取常量但不能為其賦值的原因。 要標識常量,您需要為其聲明一個名稱。 例如:int const speed = 100; 這里速度是一個常數(常數數據對象)。 速度中的數據在整個應用過程中是不能改變的。這個速度只保存感興趣類型的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM