作者前言
有興趣的小可愛可以來參觀我的giteehttps://gitee.com/qin-laoda
目錄

?內(nèi)存的大概劃分
插播二:
在VScode中 ,每個.c文件的運行都是單獨的經(jīng)過編譯器處理的
關鍵字
extern float ? for ? goto ? if ? int ? long ? register ? ? return ? short ? signed ? ? ? ? ? ? ?
sizeof ? static struct ? switch ? typedef union ? unsigned ? void ? volatile ? while ? ?
?
auto(使局部變量自動創(chuàng)建與自動銷毀)
#include <stdio.h>
int main()
{
auto int a = 0;
int b = 0;
return 0;
}
其實在定義局部變量的時候我們只是省略了auto
關鍵字 typedef
代碼:
#include <stdio.h>
typedef unsigned int uint;
typedef int INT;
int main()
{
unsigned int a = 0;
uint b = 2;
INT c = 3;
printf("a=%d b=%d c=%d", a, b, c);
return 0;
}
結(jié)果:
可以看出typedef(類型重定義),太長的數(shù)據(jù)類型我們就需要簡化?
uint? ?INT都是別名
關鍵字static(靜態(tài)的)
有三種用法 修飾局部變量? ?修飾全局變量? 修飾函數(shù)
下面我
來簡單介紹
static 修飾局部變量
代碼:
#include <stdio.h>
//沒有static修飾
int Add_1()
{
int i = 0;
i += 2;
return i;
}
//有static修飾
int Add_2()
{
static int i = 0;
i += 2;
return i;
}
int main()
{
int a = 0;
int b = 0;
while (a < 5)
{
int c = 0;
c = Add_1();
printf("c=%d\n", c);
a++;
}
while (b < 5)
{
int d = 0;
d = Add_2();
printf("d=%d\n", d);
b++;
}
return 0;
}
結(jié)果:
?static int i = 0的創(chuàng)建是進入函數(shù)就創(chuàng)建好了,不是運行它才創(chuàng)建,往后再調(diào)用就會繼續(xù)使用之前的i.不會創(chuàng)建新的i
我們可以查看反匯編
?
兩者不同?
查看反匯編的方法
調(diào)試到如圖中的為位置
?
然后右擊鼠標?
static修飾局部變量總結(jié):
局部變量在沒有static修飾會在出函數(shù)范圍就自動銷毀,有static修飾的局部變量,在第一次運行函數(shù)就創(chuàng)建了,出函數(shù)也不會銷毀,就無需再次創(chuàng)建,可以理解為生命周期延長了,但是作用域不變
本質(zhì):在沒有static修飾的局部變量就會存放在棧區(qū),而被static修飾的局部變量就會存放在靜態(tài)區(qū),靜態(tài)區(qū)的變量的生命周期和全局變量是一樣的
static修飾全局變量
第一種
代碼1:
#include <stdio.h>
int a = 12;
int g_val()
{
printf("a_val():%d\n", a);
}
int main()
{
printf("a=%d\n", a);
g_val();
return 0;
}
結(jié)果:
?第二種
?可以看出全局變量有外部鏈接屬性,這種屬性決定了全局變量可以在多個文件使用
extern 聲明外部符?
當我們利用static修飾全局變量時
?原因是啥呢?
其實被static修飾的全局變量會把全局變量的外部鏈接屬性變成內(nèi)部鏈接屬性(就是全局變量不能跨文件使用,只能在自己的.c文件使用),注意存儲的地方還是靜態(tài)區(qū),加了static修飾的全局變量只是告訴編譯器? "這個全局變量你只能在自己的,c文件使用,,不能亂跑"
可以理解為改變了作用域
static修飾函數(shù)
可以看出函數(shù)也是有外部鏈接屬性,可以跨文件使用
當我們利用static修飾函數(shù)時
?可以看出其實被static修飾的函數(shù)會把函數(shù)的外部鏈接屬性變成內(nèi)部鏈接屬性(就是全局變量不能跨文件使用,只能在自己的.c文件使用)
#define 定義常量和宏
我們前面回顧一下常量的定義
字面常量
#define定義常量
const修飾常變量
枚舉常量(enum)
#include <stdio.h>
//定義標識符常量
#define M 100
#define CH 'g'
//
int main()
{
printf("M=%d\n", M);
printf("CH=%c\n", CH);
return 0;
}
#define定義宏?
宏可以有參數(shù)也可以無參數(shù),宏是替換的
?代碼:
#include <stdio.h>
//宏
#define ADD(x, y) (x+y)
//函數(shù)
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 12;
int b = 13;
int c = ADD(a, b);
printf("c=%d", c);
return 0;
}
結(jié)果
?指針
內(nèi)存空間為了有效的進行管理:
1.把內(nèi)存劃分為一個個有效的內(nèi)存單元(比如1個字節(jié))
2.給每個內(nèi)存單元編號==地址==指針
?地址怎么來呢
圖中是32位機器,就有32根地址線,一根地址線產(chǎn)生1個bit位,共有2^32個地址,一個地址有32位bit
注意指針大小和內(nèi)存單位大小是兩個不同的概念,指針大小是指針大小,內(nèi)存單位大小是內(nèi)存單位大小
我們還可以參考內(nèi)存
代碼:
#include <stdio.h>
int main()
{
int a = 10;
return 0;
}
?
?如果是多個內(nèi)存儲存一個變量,只會顯示第一個內(nèi)存的指針,因為我們可以通過運算算出其他指針
指針變量
代碼:
#include <stdio.h>
int main()
{
int a = 10;
//指針變量
int* p = &a;//0x007AFBA8---內(nèi)存的編號==地址==指針
//*說明p為指針變量
//int 是說明p指向的是int 類型的變量
*p;//*解引用操作符 ,通過地址找到所指向的對象,即a *pa==a
printf("%d", *p);
return 0;
}
*說明p為指針變量
int 是說明p指向的是int 類型的變量
?我們創(chuàng)建的指針變量是放入的是一個指針(內(nèi)存的編號),不是內(nèi)存
指針總結(jié):
1.內(nèi)存會劃分以字節(jié)為單位的內(nèi)存單元
2.每個內(nèi)存單元都有編號,編號==指針==地址
3.c語言中創(chuàng)建的變量,是向內(nèi)存申請一塊空間,比如int a = 12,就是向內(nèi)存申請一塊4個字節(jié)的內(nèi)存空間,這個空間有編號
4.這個地址要存儲起來創(chuàng)建一個指針變量,如 int* p = &a
5.p存放的是a申請空間的編號,即指針,所以叫指針變量(用于存儲編號的)
6. *p通過p存放的編號找到a
注意一下:
存入指針變量的任何東西都當作指針處理
指針變量的大小
代碼:
#include <stdio.h>
int main()
{
char* a;
int* b;
float* c;
printf("%d\n", sizeof a);
printf("%d\n", sizeof b);
printf("%d\n", sizeof c);
return 0;
}
結(jié)果:
?可以看出指針變量空間大小為4,
其實一個指針變量的空間大小是由地址線的條數(shù)決定的,一根地址線產(chǎn)生一個bit ,
結(jié)構(gòu)體(復雜的對象)
比如 一個人:名字,身份證........
代碼:
#include <stdio.h>
struct Stu
{
char name[20];
int age;
int score;
};
int main()
{
int num = 0;
struct Stu name1 = { "張三", 18, 88};
struct Stu name2 = { "張以", 15, 85};
struct Stu name3 = { "張地方", 10, 86};
struct Stu* ps = &name1;
printf("%s %d %d\n", name1.name, name1.age, name1.score);
printf("%s %d %d\n", name2.name, name2.age, name2.score);
printf("%s %d %d\n", name3.name, name3.age, name3.score);
printf("%s %d %d\n", ps->name, ps->age, ps->score);
printf("%s %d %d\n", (*ps).name, (*ps).age, (*ps).score);
return 0;
}
結(jié)果:
?結(jié)構(gòu)體變量.結(jié)構(gòu)體成員
結(jié)構(gòu)體地址->結(jié)構(gòu)體成員
(*結(jié)構(gòu)體地址).結(jié)構(gòu)體成員文章來源:http://www.zghlxwxcb.cn/news/detail-500899.html
總結(jié)
以上就是我所分享的內(nèi)容,有不理解的小可愛可以來私聊我,這初識C語言就到此結(jié)束了,下面我會慢慢的一點點解釋文章來源地址http://www.zghlxwxcb.cn/news/detail-500899.html
到了這里,關于C語言第四課--------要我們一起快樂的學習吧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!