C語言(1) 資料型別以及儲存型別

2021-10-23 13:43:46 字數 3513 閱讀 8327

儲存大小單位

bit 只能用來儲存0或1

byte (位元組)= 8bit

kb 1024 byte

mb 1024 kb

gb 1024 mb

tb 1024 gb

資料型別(32位作業系統)

基本型別

字元型別

char 1位元組 預設是有符號型 (arm編譯器預設是無符號)

unsigned char 無符號字元型

signed 有符號字元型

整形

短整型 2位元組

short

unsigned short

signed short

整型 4位元組

int長整型 4位元組

long

長長整型 8位元組

long long

實型(浮點型)

float 單精度的浮點型別 4位元組 有效數字位可達8位

double雙精度的浮點型別 8位元組 有效數字位可達16位

浮點數不可以直接是用(==)比較

因為計算機中的數都是用二進位制表示的,大部分十進位制小數對應的二進位制小數是無限小數,也就是說,計算機可以精確表示整數,但不能精確表示小數 通常浮點型資料的比較如下所示

if(a3)應寫成if(fabs(a-3)b) 應寫成f(fabs(a-b)… 指標的實質也是變數 也是位址 因此所佔記憶體大小為4位元組

空型別

void :不能使用空型別來定義變數

:一般用在函式的返回值和函式形參的位置

記憶體區域

下面展示一下記憶體區於結構圖

|-----------------------------------

|堆區:使用malloc函式分配的

記憶體就在這個區間。

|----------------------------------

|棧區:使用者的函式的執行,函式

| 內部定義的區域性變數,都在

| 棧區。只能在當前函式中使用,其他函式無法使用

|-----------------------------------

|靜態區|.data:

| |存放的是已初始化的全域性變數,

| |static修飾的已初始化的全域性變數。

| |-----------------------------

| |.bss(這裡的初值都是0)

| |未初始化的全域性變數,static修飾的

| |未初始化的變數

| |-----------------------------

| |.ro (.rodata)(唯讀的資料段)

| |char *p = 「hell world」;

| |-----------------------------

| |.text:存放程式**

| ||-------|-----------------------------

儲存型別

atuo static register extern volatile const 對變數進行修飾

auto:(自動變數)(區域性變數)// 當前括號內有效

在定義變數的時候,如果變數沒有指定其他的儲存型別,變數就是auto的型別。

非自動型別的變數:使用static修飾的變數或者全域性變數就是非自動型別的變數。

static:靜態變數

1.延長變數的生命週期

2.限定作用域(物件可以是函式,也可以是變數)static修飾的變數或者函式只能在當前檔案中使用

void func(void)

extern:可以用來宣告變數或者函式是在其他檔案中

用法如下:

在add.c中

int add(int a,int b)

在01extern.c呼叫

extern int add(int,int);

printf(「sum= %d\n」,add(100,200));

const:(唯讀的變數)

問題:const修飾的是常量?

答案:不對

問題:const修飾的變數在rodata段嗎?

答案:不完全正確,因為const修飾的全域性變數

const int a=10;

a=100; #編譯在編譯的時候就會對const修飾的

#變數檢查,如果重新賦值了,直接報錯

const int *p=&a;或 int const *p=&a;

p指向位址中的值不可以修改

p指向的位址是可以修改的

int * const p=&a;

p指向位址中的值可以修改

p指向的位址是不可以修改的

const int * const p=&a;

p指向位址中的值不可以修改

p指向的位址是不可以修改的

將const修飾的變數位址賦給 非const型別的指標時需要強制轉換 否則會報警告

const int a=10;

int *p = (int *) &a; 這裡需要注意,這種賦值方式會改變a不可變的定義

最好使用 const int* p=(int *) a;

volatile int a;

1.防止編譯器對**進行優化:-o3

volatile int *a=&b;

*a= 110;

*a= 120;

2.防止cpu值取資料從快取中取(cache register)

volatile修飾的變數每次都從記憶體中取出(取出最新的值)

在開發過程中什麼時候需要定義變數的時候需要加volatile

第1題:向0x80000000位址中寫入0x12345678值

volatile unsigned int *p=(volatile unsigned int *)0x80000000

*p=0x12345678;

register:(暫存器)

register int a;(暫存器型別的變數)

定義的register型別的變數要比不加register的時候執行的速率要快。

問題:暫存器型別的變數執行的速率快,能不能把所有的變數都定義成暫存器型別的變數?

答案:不能,在晶元內部暫存器是有個數限制的, 比如在a53硬體平台上只有40個暫存器。

問題:在定義變數的時候const和volatile能不能同時使用?

答案:可以的,唯讀的狀態暫存器,但extern 不能跟static同時使用

Java資料型別以及儲存

code string str1 new string abc 資料儲存在堆中 string str2 new string abc 資料儲存在堆中 system.out.println str1 str2 比較引用位址是否相等 false system.out.println str1.equal...

C語言基礎1 資料型別

內容 於慕課網 c語言課程 將我自己認為沒有掌握的內容記錄於此,便於溫故。識別符號 字母數字下劃線組成,並且首字母不能是數字 在定義中不允許連續賦值,如int a b c 5 是不合法的。資料型別 基本資料型別 整形注 int short int long int是根據編譯環境的不同,所取範圍不同。...

C語言 資料型別

基本型別 整形 int 字元型 char 實型 浮點型 單精度 float 雙精度 double 構造型別 陣列型別,結構型別 struct 聯合型別 uion 列舉型別 enum 指標型別 空型別 無值型別 void。常量 在程式執行過程中,其值不能被改變的量稱為常量。變數 變數代表記憶體中具有特...