目錄
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的地址是多少
// 說明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 = #
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 = #
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、 總結學過的命令:輸入、輸出、運算、存儲