數組和指針 - 1【C++ Primer 學習筆記 - 第四章】

與vector 類似,數組也是容器

數組的缺陷:

1、長度固定

2、沒有size 操作,故,無法獲取容器大小

3、沒有push_back 操作,無法向其添加元素

4、無法更改數組長度,只能創建新的更大的數組,然後,將原數組複製到新數組。


數組維數,必須是大於1 的常量表達式。

也就是說,必須是在編譯時,就知道的值。如:const unsigned buf_size = 512;

凡是在運行時才知道的值,都不能定義數組的維數。

const unsigned buf_size = 512, max_files = 20;
int staff_size = 27;

char input_buffer[buf_size];            // 正確, buf_size 是 const
string fileTable[max_files + 1];        // 正確, max_files+1 是常量表達式

const unsigned sz = get_size(); // 錯誤,get_size() 在運行時才知道,結果值
double salaries[staff_size]; // 錯誤,staff_size 非const
int test_scores[get_size()]; // 錯誤,同 get_size()
int vals[sz]; // 錯誤,同 get_size()


顯示初始化數組:

// 顯示初始化
const unsigned array_size = 5;
int iarr[array_size] = {0, 1, 2, 3, 4};

// 省略維數
int iarr2[] = {0, 1, 2, 3};

// 相當於:{1, 2, 3, 0, 0}
int iarr3[array_size] = {1, 2, 3};

// 相當於:{"aa", "bb", "cc", "", ""}
string sarr[array_size] = {"aa", "bb", "cc"};


特殊字符:

char ca1[] = {'C', '+', '+'};	// size: 3
char ca2[] = {'C', '+', '+', '\0'}; // size:4
char ca3[] = "C++";	// size:4,末尾自動添加 null


數組不可直接複製或者賦值

char ca1[] = {'C', '+', '+'};
char ca2[] = ca1;// 錯誤

vector 的下標類型: vector::size_type
數組
的下標類型    : size_t
數組下標超出正確範圍,即,發生數組越界。將會產生嚴重錯誤。類似的安全問題,稱爲:緩衝區溢出

const unsigned array_size = 5;
int iarr1[] = {1, 2, 3, 4, 5};
int iarr2[array_size];

for(size_t i=0; i!=array_size; ++i)
	iarr2[i] = iarr1[i];

指針,&符號是:取地址操作符(address-of)

string s("This is a string");
string *sp = &s;
注:指針多數用於低級操作,容易產生錯誤,儘量少用。
而通過 vector 、迭代器等方式取代一般的數組、指針的使用。 使用 string 類型,取代 C 風格字符串。


指針定義、初始化

vector<int> *pvec;	
int *ip1, *ip2;		
string* sp1, sp2;	// sp1 是指針,而 sp2 只是 string

指針保存 0 值 或者 NULL ,表明不指向任何對象。(NULL 實際上等價於 0)
特殊的指針:void *     ,可以保存任何類型對象的地址

int ival = 1024;
int *pi = 0;
int *pi2 = &ival;
void *pi3 = pi2;
pi = pi2;


數組的算術操作。 *pi2、*pi3 結果相同,但, int *pi3 = iarr + 4 表述更直觀。
指針作減法操作,結果是 ptrdiff_t 類型的數據。
使用下標訪問數組時,實際上,是使用下標訪問了指針

int iarr[] = {1, 2, 3, 4, 5};
int *pi = iarr;
int *pi2 = &iarr[4];
int *pi3 = iarr + 4;
ptrdiff_t n = pi3 - pi;
int i = *(iarr + 3); //  iarr[3], 4

int *pi4 = pi3 - 4;  //  &iarr[0]
int x = pi3[-4];     //  iarr[0]  equals to  pi3[-4]


// 指向數組的超出末端的地址,可以計算,不能解引用
int *ipend = iarr + 5;


指針是數組的迭代器

const size_t array_size = 3;
int iarr[array_size] = {1, 2, 3};
for (int *pbegin = iarr, *pend = iarr + array_size; pbegin != pend; ++pbegin)
	*pbegin = 100;

vector<int> ivec(10, 0);
for (vector<int>::iterator iter = ivec.begin(); iter!=ivec.end(); ++iter)
	*iter = 1;





指針和引用的區別

#include <iostream>
#include <string>
#include <bitset>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::bitset;

int main()
{
	int ival = 1024, ival2 = 2048;
	int *pi = &ival, *pi2 = &ival2;
	pi = pi2;
	*pi = 5000;
	cout << "pi:" << pi << ", pi2:" << pi2 << endl;
	cout << "*pi :" << *pi << ", *pi2 :" << *pi2 << endl;

	int &ri = ival, &ri2 = ival2;
	cout << *(&ri) <<endl;
	ri = ri2;
	cout << "ri:" << ri << ", ri2:" << ri2 << endl;
	cout << "&ri:" << &ri << ", &ri2:" << &ri2 << endl;	
	

	system("pause");
	return 0;
}


結果如下:




指向指針的指針

#include <iostream>
#include <string>
#include <bitset>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::bitset;

int main()
{
	int x = 10;
	int *pi = &x;
	int **ppi = &pi;

	cout << "x:" << x << endl;
	cout << "*pi:" << *pi << endl;
	cout << "**ppi:" << **ppi << endl;
	system("pause");
	return 0;
}

結果如下



數組和指針 - 2【C++ Primer 學習筆記 - 第四章】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章