
- C程式設計教程
- C - 首頁
- C語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境搭建
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 詞法單元
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林值
- C語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof運算子
- C - 運算子優先順序
- C - 其他運算子
- C語言中的決策
- C - 決策
- C - if語句
- C - if...else語句
- C - 巢狀if語句
- C - switch語句
- C - 巢狀switch語句
- C語言中的迴圈
- C - 迴圈
- C - while迴圈
- C - for迴圈
- C - do...while迴圈
- C - 巢狀迴圈
- C - 死迴圈
- C - break語句
- C - continue語句
- C - goto語句
- C語言中的函式
- C - 函式
- C - 主函式
- C - 按值呼叫函式
- C - 按引用呼叫函式
- C - 巢狀函式
- C - 變參函式
- C - 使用者自定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 變長陣列
- C語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指向指標的指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列的區別
- C - 字元指標和函式
- C - 空指標
- C - void指標
- C - 懸空指標
- C - 解引用指標
- C - 近指標、遠指標和巨大指標
- C - 指標陣列的初始化
- C - 指標與多維陣列的區別
- C語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點(.)運算子
- C - 列舉(enum)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - typedef
- C語言中的檔案處理
- C - 輸入和輸出
- C - 檔案I/O(檔案處理)
- C預處理器
- C - 預處理器
- C - 編譯指示
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static關鍵字
- C - 隨機數生成
- C - 命令列引數
- C程式設計資源
- C - 問答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C語言中的記憶體地址
C語言中的記憶體地址
在C語言中宣告變數時,會為其分配一個記憶體地址。C編譯器將變數的值儲存在記憶體的不同段中。
記憶體段
C程式的不同元素儲存在計算機記憶體的不同段中,這些段包括:
- 程式碼段 − 程式碼段,也稱為程式碼段或簡稱為文字,是程式的一個部分,用於儲存C程式的目標版本。
- 已初始化資料段 − 程式設計師初始化的全域性變數和靜態變數在已初始化資料段中分配記憶體。
- 未初始化資料段 − 未初始化資料段也稱為bss(代表block started by symbol)。程式載入時會為此段分配記憶體。在C程式執行之前,核心會將bss中的所有資料初始化為算術“0”,並將指標初始化為空指標。
- 棧 − 棧是一種LIFO(後進先出)資料結構。棧段儲存區域性變數的值和傳遞給函式的引數的值。它還維護函式呼叫返回的指標。
- 堆 − 堆用於在執行時分配記憶體。所有執行動態記憶體分配的函式都與堆相關。
訪問記憶體地址
可以透過取地址(&)運算子訪問或指定C語言中的記憶體地址。要使用printf()函式列印記憶體地址,需要使用%p格式說明符。
語法
以下是訪問記憶體地址的語法:
&variable_name
示例
在下面的示例中,我們宣告兩個變數並列印它們的記憶體地址:
#include <stdio.h> int main() { // Declaring two variables int a; int b; // Accessing their memory // addresses and print them printf("Memory address of a is %p\n", &a); printf("Memory address of b is %p\n", &b); return 0; }
C編譯器如何分配記憶體?
記憶體可以被認為是一個位元組陣列,每個地址都是陣列中的一個索引,並儲存1個位元組。
在C程式中宣告變數時,C編譯器會根據大小需求(取決於型別)為其分配一個隨機記憶體位置。
宣告一個int變數時:
int x = 10;
編譯器會在隨機位元組地址中賦值。由於int型別需要4個位元組,因此會為此預留接下來的四個地址。
C允許您找出已為變數分配了哪個地址。您可以使用%p格式說明符來列印記憶體位置的十六進位制地址。
char x = 'A'; printf ("address of x: %p\n", &x);
這將列印“x”的十六進位制地址:
Address of x: 000000000061FE1F
示例
C語言中的陣列是連續的記憶體區域,用於儲存相同資料型別(int、long、*char等)的多個值。
#include <stdio.h> int main() { // initialize an array of ints int numbers[5] = {1,2,3,4,5}; int i = 0; // print the address of the array variable printf("numbers = %p\n", numbers); // print addresses of each array index do { printf("numbers[%u] = %p\n", i, (void *)(&numbers[i])); i++; } while(i < 5); // print the size of the array printf("sizeof(numbers) = %lu\n", sizeof(numbers)); }
輸出
執行此程式碼時,將產生以下輸出:
numbers = 0x7fff0815c0e0 numbers[0] = 0x7fff0815c0e0 numbers[1] = 0x7fff0815c0e4 numbers[2] = 0x7fff0815c0e8 numbers[3] = 0x7fff0815c0ec numbers[4] = 0x7fff0815c0f0 sizeof(numbers) = 20
廣告