c++學習筆記(11)
阿新 • • 發佈:2021-01-20
指標算術
如果對一個普通的整形變數加1那麼他的值會加1,如果是對指標加一,那麼會指向地址往後新增一個型別大小的地址區域。
int main(){
using namespace std;
double wages[3]={10000.0,20000.0,30000.0};
short stacks[3]={3,2,1};
double *pw = wages;
short * ps = &stacks[0];
cout<<"pw = "<<pw<<", *pw= "<<*pw<< endl;
pw = pw+1;
cout<<"pw指標+1後的結果\n";
cout<<"pw = "<<pw<<", *pw= "<<*pw<<endl;
cout<<"ps = "<<ps<<", *ps= "<<*ps<<endl;
ps = ps+1;
cout<<"ps指標+1後的結果\n";
cout<< "pw = "<<pw<<", *pw= "<<*pw<<endl;
cout<<"ps = "<<ps<<", *ps= "<<*ps<<endl;
cout<<"索引stacks中的兩個元素\n";
cout<<"stacks[0] = "<<stacks[0]<<" stacks[1] = "<< stacks[1];
cout<<"索引stacks中的兩個指標\n";
cout<<"*stacks = "<<*stacks<<" *(stacks+1) = "<<*(stacks+1);
cout<<"wages的大小:"<<sizeof(wages)<<endl;
cout<<"pw的大小:"<<sizeof(pw);
return 0;
結果
pw = 0x6ffde0, *pw= 10000
pw指標+1後的結果
pw = 0x6ffde8, *pw= 20000
ps = 0x6ffdd0, *ps= 3
ps指標+1後的結果
pw = 0x6ffde8, *pw= 20000
ps = 0x6ffdd2, *ps= 2
索引stacks中的兩個元素
stacks[0] = 3 stacks[1] = 2索引stacks中的兩個指標
*stacks = 3 *(stacks+1) = 2wages的大小:24
pw的大小:8
注意:陣列名稱代表首地址
正確用法是不帶&直接寫
stacks等價於&stacks[0]
sizeof(pw)求得的是指標的長度
指標小結
到此為止指標終於就學完了。總結一下有以下的要點。
- 給指標賦值、解除引用
賦值的時候可以用這種寫法
兩種方式 直接宣告賦值 new他
pn = & bubble;
pn = new char;
pn = new double[3];
單寫變數名指的是指標 前面加星號是指標中存放的值
- 動態聯編和動態聯編
一個是編譯的時候執行分配空間,一個是一遍執行程式一遍分配空間
還有今天學的指標運算
指標和字串
指標也可以用於處理字串,下面拿他和c風格字串做一個對比
#include<iostream>
#include<cstring>
int main(){
using namespace std;
char animal[20] = "bear";
const char * bird = "wren";
char * ps;
cout<<animal<<"和"<<bird<<endl;
cout<<"輸入一種動物:";
cin>>animal;
ps = animal;
cout<<ps<<"!\n";
cout<<"在使用strcyp()之前:\n";
cout<<animal<<"轉換為指標"<<(int *)animal<<endl;
cout<<ps<<"轉換為指標"<<(int *)ps<<endl;
ps = new char[strlen(animal)+1];
strcpy(ps,animal);
cout<<"在使用strcyp()之後\n";
cout<<animal<<"轉換為指標"<<(int *)animal<<endl;
cout<<ps<<"轉換為指標"<<(int *)ps<<endl;
delete []ps;
return 0;
}
結果
bear和wren
輸入一種動物:老虎
老虎!
在使用strcyp()之前:
老虎轉換為指標0x6ffdf0
老虎轉換為指標0x6ffdf0
在使用strcyp()之後
老虎轉換為指標0x6ffdf0
老虎轉換為指標0x171530
可以看出使用指標和使用陣列類似,都是先賦值,把字串付給指標和陣列。
前面的bear和wren是一種初始化 的方式,由於字串字面值是常量所以在前面用到了const。
在使用strcyp之前,由於是直接賦值方式,兩個變數的地址是相同的,而使用了函式之後,第一個引數是目標地址,第二個引數則是副本地址,為了避免後面的陣列過長,覆蓋了後面未分配的空間中,也可以使用strncpy函式
兩種方式對比,儘量使用後者更好一些。