一、指針變數定義 type *name; 這裡,’*’代表他是一個指針變數。 二、指針賦值 int *p=nullptr; 這裡,nullptr就是空指針 int a=2; p=&a; ‘&’為取地址符(在scanf裡面經常用到)將a的地址傳給指針p,其中a必須為int類型。顯然,直接對p進行存取, ...
一、指針變數定義
type *name;
這裡,’*’代表他是一個指針變數。
二、指針賦值
int *p=nullptr;
這裡,nullptr就是空指針
int a=2;
p=&a;
‘&’為取地址符(在scanf裡面經常用到)將a的地址傳給指針p,其中a必須為int類型。顯然,直接對p進行存取,操作的是地址。如果要間接操作必須要加指針操作符’*’。
註意!
1、不能把一個數賦給指針變數
2、指針變數要換地址時不能加’*’
3、printf("%d",p);是輸出指針的地址,而printf("%d",*p);才是輸出指針指向的值
指針變數同普通變數一樣,使用前要定義和賦值。如定義了int a;int *p=&a;那麼,p存放的是a的占用單元的起始地址,*p和a的意思一樣,所以printf("%d",*p);就等於printf("%d",a);
例1
a+b problem(指針版)
#include <cstdio> using namespace std; int main(){ int a,b,*p1,*p2; //聲明普通和指針變數 p1=&a; //指針變數賦值 p2=&b; scanf("%d%d",p1,p2); //p1和p2直接存的地址,不用再取地址了 printf("%d",*p1+*p2); //取 地址內容 相加 return 0; }
三、指針變數加減運算
指針僅僅支持兩種操作!+和-,並且一般配合數組操作
例2
陶陶摘蘋果(指針版)
題目描述https://www.luogu.org/problemnew/show/P1046
#include <cstdio> using namespace std; int a[10]; int main(){ int i,h,sum,*p; //聲明變數 for(i=0;i<10;i++) scanf("%d",&a[i]); //迴圈輸入 scanf("%d",&h); //輸入本身高度 h+=30; //加上凳子高度 sum=0; //蘋果能摘到總數 p=a; //a即為數組a的首地址 for(i=0;i<10;i++){ if(*p<=h) //判斷能否摘到 sum++; //能摘到+1 p++; //此處p++不是記憶體地址+1,而是+sizeof(int)(要看他是什麼類型的指針變數,如果是double的加sizeof(double)) } printf("%d",sum); //輸出總數 return 0;
}
可以看到,p++是指到達後一個整數。由此可得:p--就是到達前一個整數,p=p+3就是往後跳3個整數,而(p+3)是後面第3個整數的地址。