2、C語言從入門到精通一一變量

2.1、爲什麼需要變量

2.1.1、變量是程序的基本組成單位

不論是使用哪種高級程序語言編寫程序,變量都是其程序的基本組成單位,比如:

void main(){
	int a = 1;//定義了一個整型變量,取名爲a,並賦值爲1(強數據類型語言)
	int b = 3;//定義了一個整型變量,取名爲b,並賦值爲3
	b = 89;//給變量賦值爲89
	
	printf("a=%d\n",a);//使用輸出語句,把變量a值輸出%d表示輸出的形式爲整數
	printf("b=%d\n",b);//使用輸出語句,把變量b值輸出%d表示輸出的形式爲整數
	
	getchar();//將控制檯停留,等待輸入
}

上面代碼對應的示意圖:
在這裏插入圖片描述

2.2、變量的介紹

2.2.1、概念

變量相當於內存中一個數據存儲空間的表示,你可以把變量看做是一個房間的門牌號,通過門牌號我們可以找到房間,而通過變量名可以訪問到變量(值)

2.2.2、變量使用的基本步驟

1、聲明變量 int num;

2、賦值 num=60;

3、使用 printf(“num=%d”,num);

4、也可以一步到位:int num2 = 99;

2.3、變量快速入門

2.3.1、變量使用入門案例

案列演示

# include <stdio.h>

void main(){
	int num1 = 1; // 整形
	double score = 2.3; // 浮點型
	char gender = 'A'; // 字符
	char name[] = "尚硅谷"; //字符串

	// 說明
	// 1.如果輸出的整數 %d
	// 2.如果輸出的是小數 %f.如果希望保留小數點 %.2f
	// 3.如果輸出的是字符 %c
	// 4.如果輸出的是字符串 %s
	// 5.在輸出不同數據時,對應的格式化形式要對應起來
	printf("num=%d score=%.2f gender=%c name=%s",num1,score,gender,name);
	getchar();

}

2.4、變量使用注意事項

1、變量表示內存中的一個存儲區域(不同的數據類型,佔用的空間大小不一樣)

2、該區域有自己的名稱和類型

3、變量必須先聲明,後使用

4、該區域的數據可以在同一類型範圍內不斷變化

5、變量在同一個作用域內不能重名

6、變量三要素(變量名+值+數據類型),這一點請大家注意。

7、代碼演示

#include <stdio.h>

void main(){
	//1. 變量必須先聲明,後使用

	// num = 10; //未定義標識符num
	// int num;

	// 2.該區域的數據可以在同一類型範圍內不斷變化
	int num = 90;
	// 3.變量在同一個作用域不能重名
	// 4.變量有三個要素(變量名 num2 變量值 35 數據類型:Int)
	int num2 = 35; // num不能重複定義
	num = 60;
	num = 56;

	//num = 3.4; //從double轉換成Int,可能丟失數據
	printf("num = %d",num);

	
	getchar();
}

2.5、變量的數據類型

1、每一種數據都定義了明確的數據類型,在內存中分配了不同大小的內存空間(使用字節多少表示)。

2、數據類型一覽圖
在這裏插入圖片描述
3、數據類型的小結

  • 注意:在c中,沒有字符串類型,使用字符數組表示字符串

  • 在不同系統上,部分數據類型字節長度不一樣,int 2 或者 4

2.6、整數類型

2.6.1、基本介紹

C語言的整數類型就是用於存放整數值的,比如12,30,3456等等

2.6.2、案例演示

int num = 10;

2.6.3、整型的類型

在這裏插入圖片描述
在這裏插入圖片描述

2.6.4、整型的使用細節

1、各種類型的存儲大小與操作系統、系統位數和編譯器有關,目前通用的以64位系統爲主。
在這裏插入圖片描述
2、在實際工作中,c程序通常運行在linux/unix操作系統下.二級考試,使用windows
3、C語言的整型類型,分爲有符號signed和無符號unsigned兩種,默認是signed
4、C程序中整型常聲明爲int型,除非不足以表示大數,才使用longlong
5、bit(位):計算機中的最小存儲單位。byte(字節):計算機中基本存儲單元。
1byte=8bit
示意圖
short 3 在內存中佔有2字節
int 3 在內存中佔有4個字節
在這裏插入圖片描述
在這裏插入圖片描述

2.7、浮點類型

2.7.1、基本介紹

C語言的浮點類型可以表示一個小數,比如123.4,7.8,0.12等等

2.7.1、案例演示

void main(){
	double salary = 10000.56;
	double num1 = 1.3;
	double num2=4.5;
	double sum=num1+num2;
	
	printf("sum=%.2f",sum);// 5.80
	getchar();
}

2.7.3、浮點型的分類

在這裏插入圖片描述

2.7.4、浮點型的分類

1、關於浮點數在機器中存放形式的簡單說明,浮點數=符號位+指數位+尾數位,浮點數是近視值
2、尾數部分可能丟失,造成精度損失。

2.7.5、浮點型使用細節

1、浮點型常量默認爲double型,聲明float型常量時,須後加‘f’或‘F’。2、浮點型常量有兩種表示形式

十進制數形式:如:5.12 512.0f .512(必須有小數點)

科學計數法形式:如:5.12e2、5.12E-2

3、通常情況下,應該使用double型,因爲它比float型更精確。
4、printf(“d1=%f”,d1);//在輸出時,默認保留小數點6位
5、代碼

#include <stdio.h>

void main(){

	// 浮點型常量默認爲double,聲明float型常量時,須後加'f'或'F'

	double d1 = 1.1899259949; //從“double”到“float”截斷
	float d2 = 1.1f; // 1.1f就是float 
	double d3 = 1.3; //ok

	double d4 = 5.12;
	double d5 = .512; // 等價 0.512

	double d6 = 5.12e2; // 等價 5.12*(10^2) = 512
	double d7 = 5.12e-2; // 等價與5.12*(10^-2)= 5.12 / 100 = 0.0512

	// 在輸出時,如果%f默認保留小數點6位  double15位
	printf("d1=%.15f d2=%f d3=%f d4=%f d5=%f d6=%f d7=%f",d1,d2,d3,d4,d5,d6,d7);
	getchar();

}

2.8、字符類型(char)

2.8.1、基本介紹

字符類型可以表示單個字符,字符類型是char,char是1個字節(可以存字母或者數字),多個字符稱爲字符串,在C語言中使用char數組表示,數組不是基本數據類型,而是構造類型[關於數組我們後面詳細講解.]

2.8.2、基本案例

void main(){
	char c1='A';
	char c2='0';
	char c3='\t';
	printf("c1=%cc3=%cc2=%c",c1,c3,c2);//%c表示以字符的形式輸出getchar();
}

2.8.3、字符類型使用細節

1、字符常量是用單引號(’’)括起來的單個字符。例如:char c1=‘a’; char c3=‘9’;
2、C中還允許使用轉義字符‘\’來將其後的字符轉變爲特殊字符型常量。例如:char c3=‘\n’;//’\n’表示換行符
3、在C中,char的本質是一個整數,在輸出時,是ASCII碼對應的字符。
4、可以直接給char賦一個整數,然後輸出時,會按照對應的ASCII字符輸出[97]
5、char類型是可以進行運算的,相當於一個整數,因爲它都對應有Unicode碼.

6、案例演示

#include <stdio.h>


void main(){

	char c1 ='a';
	char c2 ='b';
	char c3 =97; 
	// 這時當我們以%c輸出時,就會按照ASCII編碼表(理解 字符 <==> 數字)對應的97對應字符輸出
	// 這裏注意
	// 1.vs2010 編譯器 是c89
	// 2.要求 變量的定義在語句之前
	int num = c2 +10; // 98 + 10 = 108

	printf("c1=%c c2=%c c3=%c\n",c1,c2,c3); // c = 'a'


	printf("num = %d",num);

	getchar();
}

2.8.4、字符類型本質探討

1、字符型存儲到計算機中,需要將字符對應的碼值(整數)找出來
存儲:字符’a’——>碼值(97)——>二進制(1100001)——>存儲()
讀取:二進制(1100001)——>碼值(97)——>字符’a’——>讀取(顯示)

2、字符和碼值的對應關係是通過字符編碼表決定的(是規定好)

2.9、ASCII碼介紹(瞭解)

1、在計算機內部,所有數據都使用二進制表示。每一個二進制位(bit)有0和1兩種狀態,因此8個二進制位就可以組合出256種狀態,這被稱爲一個字節(byte)。一個字節一共可以用來表示256種不同的狀態,每一個狀態對應一個符號,就是256個符號,從0000000到11111111。

2、ASCII碼:上個世紀60年代,美國製定了一套字符編碼,對英語字符與二進制位之間的關係,做了統一規定。這被稱爲ASCII碼。ASCII碼一共規定了127個字符的編碼,比如空格“SPACE”是32(二進制00100000),大寫的字母A是65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號),只佔用了一個字節的後面7位,最前面的1位統一規定爲0。

3、看一個完整的ASCII碼錶
在這裏插入圖片描述
4、缺點:不能表示所有字符。

2.10、布爾類型:boolean

2.10.1、基本介紹

1、C語言標準(C89)沒有定義布爾類型,所以C語言判斷真假時以0爲假,非0爲真[案例]
2、但這種做法不直觀,所以我們可以藉助C語言的宏定義。
3、C語言標準(C99)提供了_Bool型,_Bool仍是整數類型,但與一般整型不同的是,_Bool變量只能賦值爲0或1,非0的值都會被存儲爲1,C99還提供了一個頭文件<stdbool.h>定義了bool代表_Bool,true代表1,false代表0。只要導入stdbool.h,就能方便的操作布爾類型了,比如bool flag = false;[瞭解]

條件控制語句;if

循環控制語句;while…

2.10.2、應用案例

#include <stdio.h>

#define BOOL int
#define TURE 1
#define FALSE 0

void main(){
		
	BOOL isOk = TURE; // 等價 int isOk = 1
	int isPass = -1; // 0表示假 , 非0表示真
	if(isPass){
		printf("通過考試\n");
	}


	// 可以使用宏定義來完成(這裏大家先看下,體會一下,後面我們會詳解宏定義)

	// 定義一個布爾變量
	
	if(isOk){
		printf("ok");
	}

	getchar();
}

2.11、基本數據類型轉換

2.11.1、自動類型轉換

介紹:當C程序在進行賦值或者運算時,精度小的類型自動轉換爲精度大的數據類型,這個就是自動類型轉換。

2.11.2、數據類型按精度(容量)大小排序爲

在這裏插入圖片描述

2.11.3、數據類型自動轉換表規則

在這裏插入圖片描述

2.11.4、案例演示+自動類型轉換細節說明

1、有多種類型的數據混合運算時,系統首先自動將所有數據轉換成精度最大的那種數據類型,然後再進行計算(如int型和short型運算時,先把short轉成int型後再進行運算)。
2、若兩種類型的字節數不同,轉換成字節數大的類型,若兩種類型的字節數相同,且一種有符號,一種無符號,則轉換成無符號類型
3、在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊的類型將轉換爲左邊的類型,如果右邊變量的數據類型長度比左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四捨五入向前舍入
4、代碼演示

#include <stdio.h>


void main(){

	// 舉例1
	char c1 = 'a';
	int num1 = c1; // ok
	double d1 = num1; //ok


	//ok
	// 舉例2
	short s1 = 10;
	int num2 = 20;
	int num3 = s1 + num2 ;

	// 舉例3
	float f1 = 1.1f; //ok
	double d2 = 4.58667435;
	f1 = d2; // 出現精度損失(double=>float)
	printf("f1=%.8f",f1); // 期望: 4.58667435
	getchar();
}

2.11.5、強制類型轉換

  • 介紹

精度高的數據類型轉換爲精度小的數據類型。使用時要加上強制轉換符(),但可能造成精度降低或溢出,格外要注意。

  • 強制類型轉換一般格式如下:

(類型名)表達式
什麼是表達式:任何有值都可以稱爲表達式,比如1+2,int num = 2

這種強制類型轉換操作並不改變操作數本身

  • 案例演示
#include <stdio.h>

void main(){
	double d1 =1.934;
	int num = (int)d1; // 這裏注意,不是進行四捨五入,而是直接階段小數後的部分

	// 強制轉換隻對最近的數有效,如果希望針對更多的表達式轉換,使用()
	//int num2 = (int)3.5 * 10 + 6*1.5; // 3 * 10 + 6 * 1.5 = 30+9.0 = 39.0 -> 39
	int num3 = (int)(3.5 * 10 + 6*1.5); // 35.0 + 9.0 = 44.0 -> 44
	printf("\nnum3=%d",num3);
	printf("\nnum=%d d1=%f",num,d1); // d1 仍然是double類型
	getchar();
}
  • 強制類型轉換細節說明

1、當進行數據的從精度高——>精度低,就需要使用到強制轉換
2、強轉符號只針對於最近的操作數有效,往往會使用小括號提升優先級
3、案例演示看上面的就ok

2.12、基本數據類型轉換-練習題

判斷是編譯是否會通過 ?

char c = ‘a’;
int i=5;
float d =.314F;
double result = c+i+d; //c+i+d類型是float->double ok

案例:

#include <stdio.h>


void main(){
	char c = 'a';
	int i = 5;
	float d = .314f;
	double d2 = 1.0;
	//double result = c+i+d; // float -> double
	char result = c+i+d; // 提示? float -> char 警告從“float”轉換到“char”,可能丟失數據
	char result = c+i+d+d2; // 提示? double -> char 警告從“double”轉換到“char”,可能丟失數據
}

2.13、指針入門

2.13.1、基本介紹

簡單的說 指針表示一個地址(存放的是地址)

舉例說明

// 講解指針的入門

#include <stdio.h>

void main(){
	int num = 1;
	// 定義一個指針變量,指針
	//說明
	// 1.int *表示類型爲 指針類型
	// 2.名稱ptr ,prt就是一個int * 類型
	// 3.ptr指向了一個int類型的變量的地址
	int *ptr = &num;


	// num的地址是多少
	// 說明1:如果要輸出一個變量的地址,使用格式是 %p
	// 說明2:&num 表示取出num這個變量對應地址
	printf("\nnum的值 =%d num 地址=%p",num,&num);

	// 1.指針變量,本身也有地址 &ptr
	// 2.指針變量,存放的地址 ptr
	// 3.獲取指針指向的值 *ptr
	printf("\nprt的地址是 %p,ptr存放的值時一個地址 %p, ptr 指向的值=%d",&ptr,ptr,*ptr);

	getchar();
}

上面案例對應的內存佈局圖

在這裏插入圖片描述

2.13.2、指針應用案例

寫一個程序,獲取一個int變量num的地址,並顯示到終端將num的地址賦給指針ptr,並通過ptr去修改num的值.並畫出案例的內存佈局圖

案例演示

#include <stdio.h>

void main(){

//1.寫一個程序,獲取一個Int變量的num的地址,並顯示到終端
//2.將num的地址賦給指針ptr,並通過ptr去修改num的值
//分析 
	//ptr的類型 就是 int * ,注意指針的類型和該指針指向的變量類型時對應關係
//3.畫出案例的內存佈局圖


int num = 88;
int *ptr = &num;
printf("\nnum的值= %d , num的地址%p",num,&num);

*ptr = 99; // 通過ptr去改變num的,num變量的值也就響應的修改
printf("\nnum的值= %d ,num的地址%p",num,&num);*/

int a = 300; //300
int b = 400; //400
int *ptr = &a; // ok ptr的地址指向a變量
*ptr = 100; // a =100
ptr = &b; // ok ptr的地址指向b變量
*ptr = 200; //b=200
printf("a = %d b = %d prt=%d",a,b,*ptr);

getchar();

}

內存佈局示意圖

在這裏插入圖片描述

2.13.3、小練習(判斷程序是否正確)

在這裏插入圖片描述
在這裏插入圖片描述

2.13.4、指針細節說明

1、基本類型,都有對應的指針類型,形式爲數據類型*,比如int的對應的指針就是int*,float對應的指針類型就是float*,依次類推。
2、此外還有指向數組的指針指向結構體的指針指向共用體的指針,(二級指針,多級指針)後面我們再講到數組、結構體和共用體時,還會詳細講解

2.14、值傳遞和地址傳遞

2.14.1、基本介紹

C語言傳遞參數(或者賦值)可以是值傳遞(passbyvalue),也可以傳遞指針(apointerpassedbyvalue),傳遞指針也叫地址傳遞。

1、默認傳遞值的類型:基本數據類型(整型類型、小數類型,字符類型),結構體,共用體。
2、默認傳遞地址的類似:指針、數組

2.14.2、值傳遞和地址傳遞使用特點

1、值傳遞:將變量指向的存儲內容,在傳遞/賦值時,拷貝一份給接收變量.
在這裏插入圖片描述

2、地址傳遞也叫指針傳遞:如果是指針,就將指針變量存儲的地址,傳遞給接收變量,如果是數組,就將數組的首地址傳遞給接收變量。在這裏插入圖片描述

3、代碼演示

#include <stdio.h>

void main(){
	int num = 100;
	int *p = &num;
	int *p2 = p;
	*p2 = 55;
	printf("\nnum=%d  p=%p  p2=%p",num,p,p2);

	getchar();

}

2.15、課後練習題

1、試編寫程序實現如下效果

姓名 年齡 成績 性別 愛好
xx xx xx xx xx
要求:
a、用變量將姓名、年齡、成績、性別、愛好存儲
b、添加適當的註釋
c、添加轉義字符

#include <stdio.h>

void main(){
//	
//	1) 試編寫程序實現如下效果
//	姓名		年齡		成績		性別		愛好
//	xx		xx		xx		xx		xx
//	要求:
//	a、用變量將姓名、年齡、成績、性別、愛好存儲
//	b、添加適當的註釋
//	c、添加轉義字符
//	分析: 使用不同的變量來保存對應的數據
	
	char name[10] = "張三";
	short age = 23;
	float score = 78.5f;
	char gender = 'M';
	char hobby[20] = "籃球,足球";

	printf("姓名\t年齡\t成績\t性別\t愛好\n%s\t%d\t%.2f\t%c\t%s",name,age,score,gender,hobby);
	getchar();


}

2、編寫如下代碼,並看打印效果

# include <stdio.h>

void main(){
	int number1;
	int number2;
	int number3;
	int number4 = 50;
	int number5;
	number1=10;
	number2=20;
	number3=number1+number2;//30
	printf("\nNumber3=%d",number3);//30
	number5=number4-number3;//20
	printf("\nNumber5=%d",number5);//20
	getchar();
}

3、實現兩個整數的加減乘除以及取餘算法
4、判斷一個整數是偶數還是奇數,if第3和第4題的答案:

#include <stdio.h>

void main(){
	//************************
	//	  小小計算器
	//************************
	//10 + 5 = 15
	//10 - 5 = 5
	//10 * 5 = 50
	//10 / 5 = 2

	//分析
	//1.定義兩個int
	//2.根據要求進行計算,得到不同結果,可以再定義變量

	int n1 = 10;
	int n2 = 5;
	int sum = n1 + n2;
	int sub = n1 - n2;
	int mul = n1 * n2;
	int div = n1 / n2;
	int mod = n1 % n2;
	int num = 10;
	//輸出
	printf("\n************************");
	printf("\n   小小計算器");
	printf("\n************************");

	printf("\n %d + %d = %d",n1,n2,sum);
	printf("\n %d - %d = %d",n1,n2,sub);
	printf("\n %d * %d = %d",n1,n2,mul);
	printf("\n %d / %d = %d",n1,n2,div);
	printf("\n %d 模 %d = %d",n1,n2,mod);

	//  判斷num 是不是偶數還是奇數
	// if-else後面要學習的分支結構,後面還會詳解
	if(num%2==0){ // 偶數
		printf("\n%d是偶數",num);
	}else{
		printf("\n%d是奇數",num);
	}

	getchar();
}

5、 總結學過的命令:輸入、輸出、運算、存儲

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