1、概述(學習要求,學習標準)
2、數據類型和變量
3、內存四區(棧、堆、全局、代碼區)
1.接口設計(測試)
cs 客戶端 服務器
bs 瀏覽器 服務器
2.數據類型的本質
數據類型可理解爲創建變量的模具:是固定內存大小的別名。
只有有了它編譯器才知道給你多少字節
`int main(void)
{
int a = 10; //告訴編譯器,分配4個字節的內存
int b[10]; //告訴編譯器,分配4*10 = 40 個字節的內存
printf("b:%p, b+1: %p, &b:%p, &b+1: %p\n", b, b + 1, &b, &b + 1);
//b+1 和 &b+1的結果不一樣
//是因爲 b 和 &b 所代表的數據類型不一樣
//b 代表數組首元素的地址
//&b 代表整體數組的地址
return 0;}
1.1.4 數據類型的別名
點擊查看代碼
typedef struct People
{
char name[64];
int age;
} people_t;
typedef unsigned int u32; //給unsigned int類型取別名
1.1.5 數據類型的封裝
void的字面意思是“無類型”,void *則爲“無類型指針”,void *可以指向任何類型的數據。
void print_array(int a[], int n)
數組爲形參
點擊查看代碼
//如果數組作爲函數參數,數組形參退化爲指針
//void print_array(int a[1], int n)
//void print_array(int a[], int n)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//如果數組作爲函數參數,數組形參退化爲指針
//void print_array(int a[1], int n)
//void print_array(int a[], int n)
void print_array(int* a, int n)
{
// a, 當做指針用,指針類型,32位,長度4個字節
n = sizeof(a) / sizeof(a[0]); //元素個數
printf("print_array: n = %d\n", n);
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
int main(void)
{
int a[] = { 10, 7, 1, 9, 4, 6, 7, 3, 2, 0 };
int n;
int i = 0;
int j = 0;
int tmp = 0;
n = sizeof(a) / sizeof(a[0]); //元素個數
printf("n = %d\n", n);
printf("排序前:\n");
print_array(a, n);
printf("\n");
system("pause");
return 0;
}
變量的概念
概念:既能讀又能寫的內存對象,稱爲變量;若一旦初始化後不能修改的對象則稱爲常量。
1 對內存,可讀可寫;
2 通過變量往內存讀寫數據;
3 不是向變量讀寫數據,而是向變量所代表的內存空間中寫數據
變量只是個名字,真實的是它的地址 它的地址內有我們需要的數據
程序的內存四區模型
全局區分析
點擊查看代碼
#include <stdio.h>
char * getStr1()
{
char *p1 = "abcdefg2";
return p1;
}
char *getStr2()
{
char *p2 = "abcdefg2";
return p2;
}
int main(void)
{
char *p1 = NULL;
char *p2 = NULL;
p1 = getStr1();
p2 = getStr2();
//打印p1 p2 所指向內存空間的數據
printf("p1:%s , p2:%s \n", p1, p2);
//打印p1 p2 的值
printf("p1:%p , p2:%p \n", p1, p2);
return 0;
}
堆區
利用 malloc 或者new 創建的一片可以存儲數據的地址 就是堆區
堆 0x00D3FCE0
堆棧
0x00FAF844
堆區
堆棧
1.4 函數的調用模型
這說明了爲什麼在入口函數處生名的變量可以被函數使用
1.6 棧的生長方向和內存存放方向
作業
點擊查看代碼
1. 數據類型的本質是什麼? (從編譯器的角度考慮)
//告訴編譯器 開闢內存的大小 還有編譯器進行一些處理
2. 如何爲一個數據類型起別名?
typedef char* to;
3. 既然有棧空間,爲何要有堆空間?
存儲更多的數據
棧的空間由誰分配和回收?
堆的空間又由誰分配和回收?
堆棧 出函數自動銷燬 編譯器進行分配
堆 由系統底層函數進行銷燬 和分配
4. 有一個函數,數組做函數函數
void print_array(int a[128])
{
//sizeof(a) = ? 4
4個字節
}
5. 有一個數組,如何求出元素個數?
int main(void)
{
int a[] = {1, 5, 7, 0, 10, 7, 3};
sizeof(a) / sizeof(a[2]);
}
6. 在32位平臺上
char ************p = NULL;
int *q = NULL;
sizeof(p) = ?
sizeof(q) = ?
都是四字節
7. 畫出下面代碼的內存四區圖
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *get_mem(int size)
{
char *p2 = NULL; //分配4個字節的內存 棧區也叫臨時區
p2 = (char *)malloc(size);//堆空間
return p2;
}
int main(void)
{
char buf[100]; // 分配400個字節的內存 棧區也叫臨時區
int a = 10; //分配4個字節的內存 棧區也叫臨時區
int *p; //分配4個字節的內存
p = &a;
*p = 20;
char *mp = get_mem(100);
strcpy(mp, "ABCDEFG");
if (mp != NULL)
{
free(mp);
mp = NULL;
}
return 0;
}