P3.指針入門
基本介紹:
本身指針需要放在后面講解,但是授課很快就會(huì)使用到指針的概念,因此先對 指針做一個(gè)入門講解(后面還會(huì)詳細(xì)講解的),簡單的說 指針表示一個(gè)地址,
舉例說明:

指針應(yīng)用案例:
1) 寫一個(gè)程序,獲取一個(gè)int變量num的地址,并顯示到終端?
2) 將num的地址賦給指針 ptr , 并通過ptr去修改num的值.?
3) 并畫出案例的內(nèi)存布局圖?
課堂練習(xí)(判斷程序是否正確) :
void main() {?
int a = 300;?
int *ptr = a; ?
}?
題1 (錯(cuò)誤: 把 int 賦給 int *)

void main() {?
int a = 300;?
float *ptr = &a;?
}?
題2(錯(cuò)誤:把 int 的地址賦給 float *)

void main() {?
int a = 300; // a = 300?
int b = 400; // b = 400?
int * ptr = &a; // ptr 指向 a?
*ptr = 100; // a = 100 ?
ptr = &b; // ptr 指向 b?
*ptr = 200; // b = 200?
printf("\n a=%d,b=%d,*ptr=%d", a, b, *ptr);?
getchar();?
}?
//輸出什么內(nèi)容? a = 100, b = 200, *ptr = 200

指針細(xì)節(jié)說明:
1) 基本類型,都有對應(yīng)的指針類型, 形式為 數(shù)據(jù)類型 *,比如 int的對應(yīng)的指針就 是 int *, float 對應(yīng)的指針類型就是 float * , 依次類推。
2) 此外還有指向數(shù)組的指針、指向結(jié)構(gòu)體的指針,指向共用體的指針,后面我們 再講到數(shù)組、結(jié)構(gòu)體和共用體時(shí),還會(huì)詳細(xì)講解。

我的源碼及注釋:
#include <stdio.h>
void main(){
int num = 33;
//定義一個(gè)指針變量(指針就是地址)
//名稱ptr,ptr是一個(gè) int* 類型
//ptr指向了一個(gè)int類型的變量的地址(也就是說ptr指向了num變量的地址)
//也就是說,ptr保存了int類型的變量num的地址
int *ptr = #
//如果要輸出一個(gè)變量的地址,使用格式%p
// &num 表示取出num這個(gè)變量對應(yīng)的地址
printf("num的值=%d? num的地址是%p\n",num,&num);//輸出 num的值=33? num的地址是012FF754
//指針變量,本身的地址是 &ptr
//指針變量中,存放的地址 ptr (ptr里面存放的就是地址)
//指針變量,指向的值 *ptr(ptr里面存放地址所指向的值)
printf("ptr指向的值是%d ptr的值=%p? ptr的地址是%p\n",*ptr,ptr,&ptr);//輸出 ptr指向的值是33 ptr的值=012FF754? ptr的地址是012FF748
//控制臺(tái)停留,等待輸入
getchar();
}


值傳遞和地址傳遞:
C語言傳遞參數(shù)(或者賦值)可以是值傳遞(pass by value),也可以傳遞 指針(a pointer passed by value), 傳遞指針也叫地址傳遞。?
1) 默認(rèn)傳遞值的類型:基本數(shù)據(jù)類型 (整型類型、小數(shù)類型,字符類型), 結(jié)構(gòu)體, ?共用體。?
2) 默認(rèn)傳遞地址的類似:指針、數(shù)組。
值傳遞和地址傳遞使用特點(diǎn):?
1) 值傳遞:將變量指向的存儲(chǔ)內(nèi)容,在傳遞/賦值時(shí),拷貝一份給接收變量。

2) 地址傳遞 也叫 指針傳遞:如果是指針,就將指針變量存儲(chǔ)的地址,傳遞給 接收變量,如果是數(shù)組,就將數(shù)組的首地址傳遞給接收變量。


我的源碼及注釋:
/*
C語言傳遞參數(shù)(或賦值),可以是值傳遞(pass by value),也可以是傳遞指針(a pointer passed by value),傳遞指針也叫地址傳遞。
1.默認(rèn)是傳遞值的類型有:基本數(shù)據(jù)類型(整形類型(int)、小數(shù)類型、字符類型),結(jié)構(gòu)體,共用體。
2.默認(rèn)傳遞地址的有:指針、數(shù)組。
值傳遞:將變量指向的存儲(chǔ)內(nèi)容,在傳遞或賦值時(shí),拷貝一份給接收變量。
所以當(dāng)修改拷貝后的值后,不會(huì)影響原來變量num的值 (int num = 3; int num2 = num; num2=666; 修改num2的值不會(huì)影響num)
地址傳遞 也叫指針傳遞:如果是指針,就是將指針變量存儲(chǔ)的地址,傳遞給接收變量。
如果是數(shù)組,就是將數(shù)組的【首地址】傳遞給接收變量
int num=100; int * p=# int *p2=p; *p2=666;
執(zhí)行說明:在內(nèi)存為num變量開辟一塊空間,為p指針開辟一塊空間(空間中存放num的地址),
為p2指針開辟空間(里面存放p的值(也是存放num的地址)),通過*p2修改為666,p2存放的地址是num的地址,所以*p2修改的是num的值
*/
#include <stdio.h>
void main(){
int num = 33;
int * p = #
int * p2 = p;
printf("num的值是%d? num的地址是%p\n",num,&num);
printf("p指針指向的值是%d? p指針的值(存放的值(地址))是%p? p指針本身的地址是%p\n",*p,p,&p);
printf("p指針指向的值是%d? p2指針的值(存放的值(地址))是%p? p2指針本身的地址是%p\n\n",*p2,p2,&p2);
*p2 = 666;
printf("num的值是%d? num的地址是%p\n",num,&num);
printf("p指針指向的值是%d? p指針的值(存放的值(地址))是%p? p指針本身的地址是%p\n",*p,p,&p);
printf("p指針指向的值是%d? p2指針的值(存放的值(地址))是%p? p2指針本身的地址是%p\n",*p2,p2,&p2);
getchar();
}
/*
輸出:
num的值是33? num的地址是0097FAEC
p指針指向的值是33? p指針的值(存放的值(地址))是0097FAEC? p指針本身的地址是0097FAE0
p指針指向的值是33? p2指針的值(存放的值(地址))是0097FAEC? p2指針本身的地址是0097FAD4
num的值是666? num的地址是0097FAEC
p指針指向的值是666? p指針的值(存放的值(地址))是0097FAEC? p指針本身的地址是0097FAE0
p指針指向的值是666? p2指針的值(存放的值(地址))是0097FAEC? p2指針本身的地址是0097FAD4
*/


課后練習(xí)題:
1) 試編寫程序?qū)崿F(xiàn)如下效果?
姓名 年齡 成績 性別 愛好?
xx? ? ?xx? ? ?xx? ???xx? ??xx?
要求: a、用變量將姓名、年齡、成績、性別、愛好存儲(chǔ)?
b、添加適當(dāng)?shù)淖⑨?
c、添加轉(zhuǎn)義字符
2) 編寫如下代碼,并看打印效果?
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();?
}

課后練習(xí)題:
3) 實(shí)現(xiàn)兩個(gè)整數(shù)的加減乘除以及取余算法 定義兩個(gè)變量,分別保存鍵盤輸入的兩個(gè)整數(shù)【鍵盤輸入可選,如果不用輸入,可以直接用變量保存】 示例效果如下:?
請輸入第一個(gè)整數(shù):10?
請輸入第二個(gè)整數(shù):5?
*************************************?
????????????????小小計(jì)算器?
*************************************?
10 + 5 =15?
10 - 5 = 5?
10 * 5 = 50?
10 / 5 = 2
提示:用scanf語句獲取控制臺(tái)的輸入

4) 判斷一個(gè)整數(shù)是偶數(shù)還是奇數(shù) , if?

提示:if(判斷條件)
5) 總結(jié)學(xué)過的命令: 輸入、輸出、運(yùn)算、存儲(chǔ) [自己做]

我的源碼及注釋:
第1題:
#include <stdio.h>
void main(){
//使用字符數(shù)組代表字符串
char name[] = "張三";
short age = 18;
double score = 69;
char gender[] = "男";
char love[] = "籃球,music,澀澀";
printf("姓名\t年齡\t成績\t性別\t愛好\n%s\t%d\t%.2f\t%s\t%s\n",name,age,score,gender,love);
getchar();
}

3.
#include <stdio.h>
void main(){
int num1 = 0;//一般習(xí)慣賦初始值
int num2 = 0;
//鍵盤輸入
printf("請輸入num1的值: ");
scanf("%d",&num1);
printf("請輸入num2的值: ");
scanf("%d",&num2);
//加法
printf("%d + %d = %d", num1, num2, num1+num2);
//乘除法
printf("\n%d *?%d = %d",?num1,?num2,?num1*num2);//"\n"表示換行
printf("\n%d /?%d = %d",?num1,?num2,?num1/num2);
getchar();//過濾回車鍵
getchar();//暫??刂婆_(tái),等待輸入
}
4.
#include <stdio.h>
void main(){
int num = 10;
if(num % 2 == 0){
printf("%d 是偶數(shù)", num);
}else{
printf("%d 是奇數(shù)", num);
}
getchar();
}