2.20 2.21 黑馬C提高 第一天

1、概述(學習要求,學習標準)
2、數據類型和變量
3、內存四區(棧、堆、全局、代碼區)
image
1.接口設計(測試)

cs 客戶端 服務器
bs 瀏覽器 服務器

image

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 不是向變量讀寫數據,而是向變量所代表的內存空間中寫數據
變量只是個名字,真實的是它的地址 它的地址內有我們需要的數據

程序的內存四區模型
image
image

全局區分析

點擊查看代碼
#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;
}

全局區 存放地址 分析圖 https://img2023.cnblogs.com/blog/3001071/202302/3001071-20230221122157412-541786060.png

堆區

利用 malloc 或者new 創建的一片可以存儲數據的地址 就是堆區
堆 0x00D3FCE0
堆棧
0x00FAF844
堆區
image
堆棧
image
1.4 函數的調用模型
image
這說明了爲什麼在入口函數處生名的變量可以被函數使用
1.6 棧的生長方向和內存存放方向
image
作業

點擊查看代碼
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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章