網站首頁 編程語言 正文
1、定義變量的格式
存儲類型 數據類型 變量名 = 初始值;
2、6個存儲類型
自動存儲區:auto register
非自動存儲區:const static extern volatile
3、auto存儲類型-自動存儲類型
自動類型:局部變量屬于自動類型,定義局部變量時,加auto或者不加auto都是一樣的,一般省略auto.
非自動類型:全局變量,使用static修飾的全局變量或者局部變量不可以使用auto進行修飾。
#include <stdio.h>
int s; // 全局變量,屬于非自動類型,不可以使用auto修飾
// auto int k; // error
static int x; // 使用static修飾的靜態全局變量,屬于非自動類型,不可以使用auto修飾
// auto static int x; // error
int main(int argc, const char *argv[])
{
/*your code*/
int i; // 自動類型變量,省略auto
auto int j; // 自動類型變量,使用auto修飾
static int m; // 使用static修飾的靜態局部變量,屬于非自動類型,不可以使用auto修飾
// auto static int n; // error
return 0;
}
4、register存儲類型-寄存器存儲類型
定義寄存器存儲類型的變量,定義的變量分配一個寄存器的空間給變量使用。
盡量不要定義寄存器類型的變量,在CPU中寄存器的數量有限(空間有限)
寄存器變量不可以進行去地址取運算(&),原因是寄存器沒有地址。
5、const存儲類型-常量存儲類型
1.只讀,初始化后不能修改;
2.使代碼更緊湊;
3.編譯器自然保護不希望改變的參數,防止無意修改代碼
(例:const int * p=&a ,表示*p不能改變a的值
? int const * p=&a ,表示*p不能改變a的值
? int * const p=&a ,表示p指向的地址不能改變
? const int * const p=&a ,表示既不能改變指向的地址,又不能改變指向地址中的值)
6、static-靜態存儲類型
1.static修飾局部變量:延長生命周期到整個進程結束,
? 只在第一次調用此函數時,對靜態局部變量進行初始化,后面在此調用函數,不在初始化
? 如果定義的靜態局部變量沒有進行初始化,默認初始化為0
2.static修飾全局變量:外部文件不可以使用,靜態全局變量的作用域在本文件內。
3.static修飾函數:外部文件不可以使用,靜態全局變量的作用域在本文件內。
7、extern-修飾全局變量
1.externa修飾全局變量,表示這個全局變量在其他文件中定義的
2.externa修飾函數,表示這個函數是在其他文件中定義的
3.聲明一個變量,extern聲明的變量沒有建立存儲空間。int a;//變量在定義的時候創建存儲空間
8、volatile-易變存儲類型
volatile關鍵字用來阻止編譯器認為的無法“被代碼本身”改變的代碼進行優化。
如在C語言中,volatile關鍵字可以用來提醒編譯器它后面所定義的變量隨時有可能改變,
因此編譯后的程序每次需要存儲或讀取這個變量的時候,都會直接從變量地址中讀取數據。
如果沒有volatile關鍵字,則編譯器可能優化讀取和存儲,可能暫時使用寄存器中的值,
如果這個變量由別的程序更新了的話,將出現不一致的現象。
在java并發編程中,volatile的作用
對于可見性,java提供了volatile關鍵字來保證可見性。
當一個共享的變量被volatile修飾時,它會保證修改的值會立即被更新到主存當中,當其他線程需要讀取時,
它會去內存中讀取新值。
9、用戶空間內部分布圖
代碼解析:
#include <stdio.h>
int d; // 全局變量未初始化 值為0 .bss
int e=10; //全局變量初始化 .data
char *p = "hello"; //字符指針 p在.data "hello"在.rodata
char arr[] = "world"; //.字符數組 .data
static int f; //使用static修飾的未初始化的全局變量 值為0 .bss
static int g=20; //使用static修飾的初始化的全局變量 .data
int main(int argc, const char *argv[])
{
int a=10; //局部變量初始化 棧區
int b; //局部變量未初始化,隨機值 棧區
static int c; //使用static修飾的局部變量 未初始化 值為0 .bss
static int d=20; //使用static修飾的局部變量初始化 .data
char *p = "hello"; //字符指針 p:在棧區 “hello”在 .rodata
char arr[] = "world"; //字符數組 棧
char *q = malloc(10); //q在棧區,指向堆區的10字節的?地址
return 0;
}
原文鏈接:https://distant-rove.blog.csdn.net/article/details/127608500
相關推薦
- 2022-10-04 Python基礎之dict和set的使用詳解_python
- 2023-08-13 常見的linux命令
- 2022-06-01 C#的通用DbHelper類(支持數據連接池)示例詳解_C#教程
- 2022-10-22 python?中的?super詳解_python
- 2022-01-19 wangeditor富文本編輯器拓展菜單——格式刷
- 2022-06-11 ASP.NET登出系統并清除Cookie_實用技巧
- 2022-05-24 .NET?Core剪裁器背后的技術及工作原理介紹_實用技巧
- 2023-02-07 GoLang?sync.Pool簡介與用法_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支