一.
怎樣給多維陣列動態分配記憶體
//allocate:
int **p = new int* [m];
for(int i = 0 ; i < m ; i++)
p[i] = new int[n];
//use:
for(int i = 0 ; i < m; i++)
for(int j = 0 ; j < n ; j++)
p[i][j] = i * j;
//free:
for(int i = 0 ; i < m ; i++)
delete p[i];
delete p;
二.字元陣列v字串指標:
字元陣列如果在函式裡宣告則在棧上分配記憶體空間.
char a[1034]="bac" --true,這時可以改變a位址範圍內的任一位址所指向的內容.如:a[0]='a'.而a的值一般是不變的,除非重新分配位址.
char a[1034]; a="bac" --faile 因為"abc"有const char*型別的,而a是char的.
strcpy(a,"abc"); -true
如果宣告字串指標char *a ="abc"常量,當把常量賦給乙個指標(a)時,則a是在靜態儲存空間分配記憶體,原則上a位址裡範圍內指向的內容不可以改變.
char *a="abc"; a="bcd" --true 可以改變a的值,但不可以改變這個位址裡範圍內指向的內容. char *a; a="abc"; --true
char *a="abc"; a[1]='d'; -false
strcpy(a,"abc") --false *a的值不可變
char *a=malloc(size); --則a在堆分配空間,相當於char a[size],用free釋放記憶體
char *a=new char(size); --同上,不過要用delete釋放記憶體
這時strcpy(a,"abc"); a[n]='d'; --true
三.多型:
#include
using namespace std;
class a
int b;
virtual int get()
};
class c :public a
int d;
int add()
int get()
};
/*void fun(a &www)//第一版本
*/
void fun(a www)//第二版本
int main()
{
a *pa;
c cc;
pa=&cc;//很正常
cout下面解釋func:
第一版本是傳引用,就相當於是傳了指標,所以可以實現多型。func(cc)會呼叫c的get(),func(aa)會調a的get()。
004016df lea ecx,[ebp-1ch]
004016e2 push ecx
004016e3 call @ilt+350(fun) (00401163)
可看出,只用堆疊傳了指標,沒有挎貝物件。
第二版本是傳物件,會調挎貝建構函式,這裡沒有定義,所以就進行了預設的挎貝。因為形參是基類a的,它不知道c又在它身上加了d這個成員,所以它就把乙個c的物件挎貝成了a的物件,a中沒有的成員d就被切割了。所以func(cc)和func(aa)都只會調a的成員函式get()。這種現象就是所謂的「物件切割」,經過挎貝後,c的物件被切割得只剩下a的部分了。
0040172c call @ilt+115(a::a) (00401078)
00401731 call @ilt+640(fun) (00401285)
很明顯調了a的挎貝建構函式,物件被切割。
關於C指標
在 c語言中指標可以說是其精華,常有一句話,學會了指標你也就學會了 c語言。但是很多人不能理解指標。我寫這篇文章的目的是幫助大家理解指標,內容都是跟人的見解,沒有指標基礎的 c語言高手和不喜歡的就別看了。大家都認為,c語言之所以強大,以及其自由性,很大部分體現在其靈活的指標運用上。因此,說指標是 c...
C 關於懸掛指標
如果乙個地方指標既不為空,也沒有被設定為指向乙個已知的物件,則這樣的指標稱為懸掛指標。在程式裡面是很危險的事 如下 include stdafx.h include iostream using namespace std typedef string t void f int p int main...
C 中關於this指標
在學習完c語言之後,很大的感覺就是指標是貫穿c語言的核心,但是接觸到c 後,發現很多都是封裝好的,直接用就可以。其中有一塊問題就是,通過函式去呼叫類的成員,上好像是直接訪問的,但是又有很多問題,為啥這個類裡面的函式可以直接訪問這個類裡面的成員呢?這就是我們需要關注的this指標。首先來看下面這段 c...