91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C 提高1 內存四區 變量本質 棧開口方向 指針鐵律1

發布時間:2020-07-25 10:15:04 來源:網絡 閱讀:645 作者:990487026 欄目:開發技術


C 提高第一天復習

內存四區,變量常量的本質,函數調用模型,棧開口方向,指針鐵律1,指針是一種數據類型




C 提高學員標準:寫一個標準的冒泡排序

選擇法或者冒泡法排序

在一個函數內排序

通過函數調用的方式排序

數組做函數參數的技術盲點和推演 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	int a[] = {3,66,54,32,11,22,99,2334,32};
	
	for (i = 0; i < sizeof(a) / sizeof(int); i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n", a[i]);

	for (i = 0; i < sizeof(a) / sizeof(int); i++)
	{
		for (j = i+1; j < sizeof(a) / sizeof(int); j++)
		{
			if (a[i] > a[j])
			{
				tmp = a[i];
				a[i] = a[j];
				a[j] = tmp;
			}
		}
	}

	for (i = 0; i < sizeof(a) / sizeof(int); i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n", a[i]);



	system("pause");
}

編譯運行:
3 66 54 32 11 22 99 2334 32
3 11 22 32 32 54 66 99 2334
請按任意鍵繼續. . .


冒泡程序,優化輸出與排序 與 函數的數組參數問題

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printfArray(int array[], int len)
{
	int i;
	for (i = 0; i < len; i++)
	{
		printf("%d ", array[i]);
	}
	printf("\n", array[i]);
}

//數組做函數的參數的退回問題,退回為一個指針
//結論:把數組內存的首地址和有效長度傳給被調用的函數
//本質:函數中的數組形參,編譯器會把它當成指針處理
void sortArray(int array[], int len)
{
	int i, j, tmp;
	for (i = 0; i <len; i++)
	{
		for (j = i + 1; j < len; j++)
		{
			if (array[i] > array[j])
			{
				tmp = array[i];
				array[i] = array[j];
				array[j] = tmp;
			}
		}
	}
}


int main()
{

	int a[] = {3,66,54,32,11,22,99,2334,32};
	int len = sizeof(a) / sizeof(int);

	printfArray(a, len);
	sortArray(a,len);
	printfArray(a, len);
	
	system("pause");
}



編譯運行:
3 66 54 32 11 22 99 2334 32
3 11 22 32 32 54 66 99 2334
請按任意鍵繼續. . .



數據類型概念:

“類型”是對數據的抽象 

類型相同的數據有相同的表示形式、存儲格式以及相關的操作 

程序中使用的所有數據都必定屬于某一種數據類型 

C 提高1  內存四區 變量本質 棧開口方向 指針鐵律1




基本數據類型:typedef 數組與地址

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct teacher1{
	char name[64];
	int age;
}Teacher1;

//使用typedef,以后定義就是這樣了 Teacher2 t2;
typedef struct teacher2{
	char name[64];
	int age;
}Teacher2;


int main()
{
	
	int b[10];
	printf("b:%d , b+1:%d \n", b, b + 1);
	printf("&b:%d, &b+1:%d \n", &b, &b + 1);
	// b 代表數組首元素的地址
	// &b代表整個數組的地址
	// &b+1代表跨過整個數組地址


	struct teacher1 t1;
	Teacher1.age = 0;
	Teacher2 t2;

	typedef int u32;
	printf("u32 =%d \n",sizeof(u32));


	system("pause");
}
編譯運行:
b:3603504 , b+1:3603508
&b:3603504, &b+1:3603544
u32 =4
請按任意鍵繼續. . .



數據類型的本質思考

思考數據類型和內存有關系嗎?

C/C++為什么會引入數據類型?


數據類型的本質 

數據類型可理解為創建變量的模具(模子);是固定內存大小的別名。

數據類型的作用:編譯器預算對象(變量)分配的內存空間大小

程序舉例,如何求數據類型的大小  sizeof(int *)

請問:數據類型可以有別名嗎?數據類型可以自定義嗎?(typedef)

C 提高1  內存四區 變量本質 棧開口方向 指針鐵律1




數據類型大小C程序:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int a = 10;
	int b[10] ;
	printf("int a:%d \n", sizeof(a));
	printf("int a:%d \n", sizeof(int *));
	printf("int b:%d \n", sizeof(b));
	printf("int b:%d \n", sizeof(b[0]));
	printf("int b:%d \n", sizeof(*b));
	printf("hello.....\n");
	return 0;
} 
編譯運行:
C:\Users\chunli>gcc main.c & a
int a:4
int a:4
int b:40
int b:4
int b:4
hello.....



常量的探討:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char * getstr1()
{
	char *p = "1234";
	return p;
}

char * getstr2()
{
	char *p = "5678";
	return p;
}

int main()
{
	char *p1 = NULL;
	char *p2 = NULL;
	p1 = getstr1();
	p2 = getstr2();
	printf("%s,%s \n", p1, p2);
	printf("%d,%d \n", p1, p2);
	system("pause");
}

編譯運行:
1234,5678
14309464,14309644
請按任意鍵繼續. . .


改一改:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char * getstr1()
{
	char *p = "1234";
	return p;
}

char * getstr2()
{
	char *p = "1234";
	return p;
}

int main()
{
	char *p1 = NULL;
	char *p2 = NULL;
	p1 = getstr1();
	p2 = getstr2();
	printf("%s,%s \n", p1, p2);
	printf("%d,%d \n", p1, p2);
	system("pause");
}

編譯運行:
1234,1234
2054232,2054232
請按任意鍵繼續. .



堆棧變量,函數返回一個被析構的內存空間塊

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//堆
char * getmem(int size)
{
	char *p = NULL;
	p = (char *)malloc(size);
	return p;
}

//棧
//return 不是把內存塊返回出來,而是把首地址返回了
char * getmem2()
{
	char p[20];
	strcpy(p, "haha2 \n");
	return p;	//【危險!】p即將釋放,但是地址返回去來了。
}


int main()
{
	char  *p = NULL;
	p = getmem(20);
	strcpy(p, "haha1 \n");
	printf("%s",p);
	free(p);
	p = NULL;
	
	p = getmem2();//返回了一個被析構的數據塊
	printf("%s", p);//不應該這么做!


	system("pause");
}

編譯運行:
haha1
haha2
請按任意鍵繼續. . .




棧的開口方向:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{

	int a;
	int b;
	printf("&a = %d \n", &a);
	printf("&b = %d \n", &b);
	system("pause");
}
編譯運行:
C:\Users\chunli>gcc -o main.exe main.c & main
&a = 2686652
&b = 2686648
請按任意鍵繼續. . .

C 提高1  內存四區 變量本質 棧開口方向 指針鐵律1

數組基地址永遠都是在下面:

C 提高1  內存四區 變量本質 棧開口方向 指針鐵律1



指針鐵律1:指針是一種數據類型


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//*p 在等號的左邊 修改內存
//*p 在等號的右邊 讀取內存


char * getstr()
{
	int *tmp = "hello \n";//	常量區
	return tmp;
}

int main()
{

	int a;
	char *p1 = 100;//分配4個字節
	p1 = &a;
	*p1 = 20;	//*就像一把鑰匙,找到這個地址,并修改它
	printf("%d  \n", sizeof(p1));
	printf("%d  \n", *p1);

	int b = 0;
	b = *p1;
	printf("%d  \n", b);


	char p2 = (char *)malloc(100);
	char p3 = (char *)malloc(100);

	char *p4 = getstr();
//	*(p4 + 2) = 'K';  因為返回的是常量	,不能修改
	printf("%s",p4);
	system("pause");
}



指針經典話語:

1,指針指向誰,就把誰的地址賦給指針;

2,指針變量 和 它指向的內存空間變量是兩個不同的概念

3,理解指針的關鍵是內存,沒有內存哪里來的指針


變量的本質是一個固定大小的數據塊,變量名就是數據塊的編號


內存的使用范圍:

main函數可以在棧分配內存/堆分配內存/全局分配內存,可以給子函數使用

子函數在棧分配的內存不能給主函數使用,但是堆內存與全局變量是可以給main使用


編譯器會為每個程序分配一個內存4區,主函數與子函數公用這個內存4區


建立正確程序運行內存布局圖是學好C的關鍵!


 


指針鐵律1:指針是一種數據類型

1)指針也是一種變量,占有內存空間,用來保存內存地址

2)*p 操作內存;

3)*就像一把鑰匙,通過一個地址(&a),去修改a變量的標示的內存空間

4)不斷的給指針賦值,相當于不停的改變指針的指向。

5) 指針是一種數據類型,是指它指向內存空間的數據類型





向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盐山县| 呈贡县| 东乡族自治县| 鹤岗市| 井冈山市| 惠安县| 多伦县| 安岳县| 尉氏县| 米脂县| 公主岭市| 昭觉县| 中宁县| 建阳市| 汕头市| 陇西县| 六枝特区| 长子县| 张家港市| 饶平县| 柳州市| 建始县| 平邑县| 杭锦旗| 佛学| 布尔津县| 双柏县| 福州市| 邯郸市| 巴中市| 穆棱市| 察雅县| 全椒县| 囊谦县| 莱西市| 武功县| 潜江市| 鹤庆县| 油尖旺区| 新安县| 英山县|