1. 程式人生 > 其它 >c++學習筆記(11)

c++學習筆記(11)

技術標籤:學習筆記c++字串

指標算術

如果對一個普通的整形變數加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函式
兩種方式對比,儘量使用後者更好一些。