C語言指針與內存

  • 初始指針
    使用指針來進行交換值
#include<stdio.h>
void change(int *a,int *b){
    int tmp=*a;
    *a = *b;
    *b = tmp;
}
int main(){
    int a=5,b=3;
    change(&a,&b);
    printf("num a = %d\nnum b = %d\n",a,b);
    return 0;
}```
- gdb調試工具
`brew install gdb`
調試的時候,生成可以調試的版本,`gcc -g main.c -o main.out`
`gdb ./main.out`對程序進行調試,Mac里面必須是這樣`sudo gdb ./main.out`才能對程序進行調試。
`l`列出源代碼,按回車繼續剛才的命令
`break 12`斷點放在12行
`start`單步調試
`n`下一步
`p a`打印出a的變量值
`q`退出
`s`進入函數里面
`bt`查看函數堆棧
`f 1`跳到1這個棧里面
- 計算機中的數據表示方法
計算機中內存中最小單位是字節,1Byte字節=8bit位
- 內存管理
操作系統統一管理,32bit系統,最大使用4G內存,由尋址空間決定的,地址總線是32位,尋址空間是32位,也就是給內存編號只能有32位。
地址總線可以存在多種狀態,2^32個狀態,所以就是2^32字節,4GB,64位操作系統,64位的地址總線,所以內存足夠了,操作系統會給內存地址進行編號,編號就是唯一的內存字節的地址,一個字節存放8個二進制位的數據。
64位操作系統中,用戶應用程序使用的內存只要有前面的48位就夠了,其他的內存空間是給操作系統內核使用的
高位內存:系統內核->棧->堆->數據段->代碼段:低位內存
代碼編譯后的二進制數據加載到內存中,代碼段
聲明的全局變量和一些常量在數據段
中間的區域是自由可分配的內存
- 變量和指針的本質
靜態變量,靜態局部變量,作用域是當前函數,從定義位置,到其所在的{}結束位置,生命周期是從程序運行到程序退出,貫穿整個運行時間,下次函數調用的時候,靜態局部變量不會再次初始化,而是沿用上次函數退出時的值。
靜態全局變量,作用域為當前文件,從定義位置到文件結尾,聲明周期為從程序運行到程序退出,貫穿整個運行時間,但是動態全局變量的作用域是整個項目,即最終編譯成可執行文件的所有文件均可以使用動態全局變量。
C語言語法是不允許直接操作代碼段的,代碼段也是有地址的,除了代碼編譯后存在代碼段外,代碼的狀態信息是存在內存的棧區域。
C語言是強類型,靜態類型的。
變量的本質是一個代號,標識符,代表的是某個地址空間
指針本身也是一個變量,保存的數據是地址,指針變量的地址也就是指針的指針。指針的本質是保存內存地址。
- 操作系統對內存的管理
編譯器的優化功能,對源代碼進行優化,將同一類型的變量內存地址分配在一塊,使得程序執行更快。64位系統中指針是8個字節,因為地址總線是64位的。
棧的內存空間保存了程序運行時候的狀態。
代碼段的內存地址是向上增長分配的,然后棧段的內存地址是從大往小進行分配的。
- 函數棧以及數據段內存
棧里最先分配地址的函數內存地址更大一些,靜態變量,常量還有全局變量默認是在數據段中,靜態變量屬于某個函數特定的,一個函數被多次調用,但是都在數據段中。
- 函數指針與指針指向的數據訪問
`int (*pquadrate)(int a) = &quadrate;`定義一個函數指針
`int s = (*pquadrate)(a);`使用這個函數指針,()表示地址指向某個函數整體,然后后面調用傳參數a。如果指向棧內存,數據段內存表示直接去變量里面的值,指向代碼段,就是一片代碼塊。
- 示例代碼

include<stdio.h>

int global = 0;
int rect(int a,int b){
static int count = 0;
count++;
global++;
int s = a * b;
return s;
}
int quadrate(int a){
static int count = 0;
count++;
global++;
int s = rect(a,a);
return s;
}
int main(){
int a = 3;
int b = 4;
int *pa = &a;
int *pb = &b;
int pglobal = &global;
int (
pquadrate)(int a) = &quadrate;
int s = quadrate(a);
printf("%d\n",s);
}```

  • 數組申明的內存排列
    x/3d 0x7fffffffde14從這個地址開始顯示3個十進制,默認是按照4字節顯示
    這里經過gcc優化,b的地址在最前面,其次是a,但是i的地址在$10 = (int *) 0x7fff5fbffc54, b的地址$9 = (int *) 0x7fff5fbffc60,a的地址$8 = (int *) 0x7fff5fbffc64,array的地址$12 = (int (*)[3]) 0x7fff5fbffc6c,說明這些變量之間的地址分配還不是連續的,但是數組間的地址分配是連續的。
#include<stdio.h>
int main(){
    int a = 3;
    int b = 2;
    int array[3];//必須是常量
    array[0] = 1;
    array[1] = 10;
    array[2] = 100;
    int *p = &b;
    int i;
    for(i = 0;i < 6;i++){
        printf("*p = %d\n",*p);
        p++;
    }
    printf("------------------------\n");
    p = &b;
    for(i = 0;i<6;i++){
        printf("p[%d]=%d\n",i,p[i]);
    }
    return 0;
}```
- 指針運算
`p++`定義了p是int類型,所以大小是4字節,自增就是到下一個4字節的地址。
`p[1]`表示把p向下偏移4個字節
指針是變量,數組是指針常量,數組本身也是地址。
- 字符數組和指針字符串

include<stdio.h>

int main(){
char str[] = "hello";
char *str2 = "world";
char str3[10];
printf("input the value\n");
scanf("%s",str3);
printf("str is %s\n",str);
printf("str2 is %s\n",str2);
printf("str3 is %s\n",str3);
}```
str2在代碼段,str2是指向這個地址而已,字符類型的指針,字符數組str3本身就是內存地址。str2指向字符串的指針,不能向里面scanf,str2是存的world字符串的地址,在代碼段的地址,不能被修改,而str是字符數組的地址,str地址是在棧里面,字符數組是以\0為結尾。x/6cb 0x7ffffffde00打印6個字符,單字節顯示。
棧和堆內存才能被寫入。

  • 字符數組
    str[3]='\0'表示字符串結束位置,str2指向的是常量字符串,所以不能被修改
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容