指標

by Welly

聽說指標很難;_;?

指標(位置)

pointer:就是電腦把這個東東儲存在一個地方,而這個地方的地址就是所謂的指標~

 

-->

而他的地址會用一個十六進位制的數字存起來,所以才會看不懂歐~

#include <iostream>

using namespace std;

int main()
{
    int a;
    cout<<&a;

    return 0;
}

//0x61fe1c

等等你誰啊!

取址符'&'

用法:在要求地址的變數前面加上'&'J個符號:D

 

-->

J個東東叫做取址符,在變數前面加這個就可以拿到他的地址了!(等於跟電腦說我要這個東東的地址)

#include <iostream>

using namespace std;

int main()
{
    int a;
    cout<<&a;

    return 0;
}

//0x61fe1c
//再看一次有看懂嗎?

做一次看看:D(3min)

指標變數(指標)

pointer variable:就是拿來存指標(位置(就是剛剛那個!))的變數歐~

 

-->

又叫做存址型態~

像整數變數是拿來存整數的,浮點數變數是拿來存浮點數的,而指標變數就是拿來存指標的:D

#include <iostream>

using namespace std;

int main()
{
    int a;
    int* p;
    p=&a;
    cout<<p;

    return 0;
}

//0x61fe14

好我知道指標變數是甚麼了

所以怎麼用?

指標變數ㄉ長相

記得加星星就歐凱!

長醬歐:

欲求變數指標的型態+'*'+變數名稱

(在供蝦餃!!!)

 

-->

看栗子解釋~

#include <iostream>

using namespace std;

int main()
{
    int a;
    int* p;
    p=&a;
    cout<<p;

    return 0;
}

//0x61fe14

圖解一下:D

做一次看看:D~(3min)

那如果我今天有一個地址

我想要讓電腦告訴我裡面是甚麼ㄋ?

剛剛學過了取址符

不覺得應該也要有一個符號可以做到我們的要求嗎?

取值符'*'

用法:在要求值的指標變數前面加上'*'J個符號

 

-->

J個東東叫做取值符,在指標變數前面加這個就可以拿到裡面存的東東!(等於跟電腦說我要這個地址裡的東東)

#include <iostream>

using namespace std;

int main()
{
    int a=2;
    int* p;
    p=&a;
    cout<<*p;

    return 0;
}

//2

練習一下~(判斷輸出)

#include <iostream>

using namespace std;

int main()
{
    int a=2;
    int* p;
    p=&a;
    cout<<&a<<endl;
    cout<<a<<endl;
    cout<<*a<<endl;
    cout<<p<<endl;
    cout<<*p<<endl;

    return 0;
}

練習一下~(判斷輸出)

#include <iostream>

using namespace std;

int main()
{
    int a=2;
    int* p;
    p=&a;
    cout<<&a<<endl;
    cout<<a<<endl;
    cout<<*a<<endl;
    cout<<p<<endl;
    cout<<*p<<endl;

    return 0;
}

//0x61fe14
//2
//compiler error
//0x61fe14
//2

練習題(交換球球~)

輸入格式:

首先會有一個整數n,代表有幾次操作
接下來會有n個數字,代表每一次操作的種類
1代表交換左邊和中間的杯子
2代表交換左邊和右邊的杯子
3代表交換中間和右邊的杯子

輸出格式:
輸出「左邊」、「中間」或「右邊」,代表球最後會在哪一個杯子裡面

例如:
輸入「5 3 2 1 2 3」,會輸出「右邊」
輸入「6 2 3 1 1 3 1」,會輸出「左邊」
輸入「7 1 1 1 3 2 2 1」,會輸出「中間」

一開始魔術師有三個杯子,球在中間那個杯子裡面,接著會有n次交換的動作,請你找出最後球在哪個杯子

**要求:要用函式寫歐!!!**

484覺得看起來明明沒問題卻交換不了?

大嘎的函式是不是長醬?

#include <iostream>
using namespace std;
void exchange(int a,int b){
    int tem=a;
    a=b;
    b=tem;
}
int main(){
    int r,m,l;
    m=1;
    int time;
    int now,tem;
    cin>>time;
    for(int i=0;i<time;i++){
        cin>>now;
        if(now==1){
            exchange(l,m);
        }
        else if(now==2){
            exchange(l,r);
        }
        else if(now==3){
            exchange(r,m);
        }
    }
    if(r==1){
        cout<<"右邊";
    }
    else if(l==1){
        cout<<"左邊";
    }
    else if(m==1){
        cout<<"中間";
    }


    return 0;
}

變數的作用範圍

全域變數

在程式的任何地方都能用

區域變數

只有在特定的區域內可以用

ex.迴圈、函式等等

所以我函式內用的變數

在離開函式之後就不能用了:(

那怎麼辦?;_;

pass by value/reference/pointer

&

指標X函式

special thanks:翠憶學長大凱瑞

聽個故事:D

壞壞小明想要抄同學的作業(哪泥!!!

傳值輸入pass by value

第一天:小華叫小明用單身十六年的手速自己抄在習作上

回家以後小明看到習作上的題目就想在習作上面畫畫

->

先複製再把"值"傳入 並且不會更改到原本的值 就像小明先把答案抄到自己的習作一樣 他後來在上面畫畫並不會更改到小華的習作簿

 

#include<iostream>
using namespace std;

void exchange(int A, int B) {
    int tmp = A;
    A = B;
    B = tmp;
    cout << A << " " << B << endl;  //2 1
}

int main(){
    int a = 1, b = 2;
    exchange(a, b);
    cout << a << " " << b;  //1 2
    return 0;
}

傳址輸入pass by pointer

第二天:小智直接把自己的習作借給小明(天阿真是個好人)回家以後小明看到習作上的題目又想在習作上面畫畫

 

->直接把"地址"傳入 因此會更改到原本的值 就像小智直接把習作給小明一樣 他後來在上面畫畫會更改到小智的習作簿

 

#include<iostream>
using namespace std;

void exchange(int *A, int *B) {  //A, B 是 a, b的記憶體位址 //指標變數(存址型態)
    int tmp = *A;  //取A記憶體位址的值,也就是a的值  //取值A
    *A = *B;  //把A記憶體位址的值(a),改成B記憶體位址的值(b)  //取值A,B
    *B = tmp;  //把B記憶體位址的值(b),改成tmp  //取值B
    cout << *A << " " << *B << endl;  //2 1  //取值A,B
}

int main(){
    int a = 1, b = 2;
    exchange(&a, &b);  //傳入a, b的記憶體位址  //取址a,b
    cout << a << " " << b;  //2 1
    return 0;
}

參考(reference)

簡單來說有點像是幫變數娶小明取小名的感覺

用法:

欲取參考的變數型態+'&'+他的小名

(你說得很清楚我聽得很模糊阿阿)

-->

看栗子~

**指標也可以歐~~~:D**

#include <iostream>

using namespace std;

int main(){
    int a=2;
    
    int *p=&a;
    
    int &r=a;
    
    int *&rp=p;
    
    return 0;
}

意思是他們是同一個人嗎?

那我改參考的值

原本的值會被改到嗎?

會歐!!!

#include <iostream>

using namespace std;

int main(){
    int a=2;
    
    int b=7;
    
    int *p=&a;
    
    int &r=a;
    
    int *&rp=p;
    
    r=3;
    cout<<r<<endl;//3
    cout<<a<<endl;//3
    
    cout<<p<<endl;//0x61fe0c
    
    rp=&b;
    cout<<rp<<endl;//0x61fe08
    cout<<p<<endl;//0x61fe08
    
    return 0;
}

*注意:參考在宣告的時候

就要說他是誰的小名*

練習一下:D(3min)

傳參考輸入pass by reference

既然傳入的是參考,就等於是直接把a跟b傳進去ㄌ~所以應該可以推論出醬可以直接更改到他的值八~

 

->所以是會更改到原本的值的歐~

 

#include<iostream>
using namespace std;

void exchange(int &A, int &B) {
    int tmp = A;
    A = B;
    B = tmp;
    cout << A << " " << B <<endl;
}

int main(){
    int a = 1, b = 2;
    exchange(a, b);
    cout << a << " " << b;
    return 0;
}
Made with Slides.com