Please enable JavaScript.
Coggle requires JavaScript to display documents.
Pointer (operation &,* &::後面接data type, &s ,代表s 這個data type…
Pointer
operation
&,
*
&::後面接data type, &s ,代表s 這個data type 的位址
必須要先宣告一個data type,才能用
e.g int s
int
*
p = &s
也就是說&s 不會s宣告時候用,因為&代表是data 的
address
*
:: 就是pointer,在宣告時只能
*
p,代表宣告p是一個pointer type,用的時候*p代表解參考
address
char *d;
char s = 'i';
d = &s
d 結果存的是s 的位址
or
int
*
p1,
*
p2;
p1 = p2;
則p1,p2 指向地址相同
dereference
char
d
char s = 'i';
*
d = s;
d 指向位址的內容=s裡面的內容
那這時候d指向誰?
or
int v1 = 0;
int
*
p1;
p1 = &v1;
*
p1 = 45;
則v1
*
p1 都等於45
or
int
*
p1,
*
p2;
*
p1 =
*
p2
則兩者指向的地址data都一樣
p2指向地址data copy 給p1 指向地址data
初始化與const
int
*
p1 = 0
代表p1 指向空位址
double
*
const p1 = &radius
代表p1 指向地址=radius地址,不可更動
const double
*
p1 = &radius
代表p1指向地址的data = radius的data,且data不可更動
const double
*
const p1 = &radius
就是兩個都固定
new
operator
int
*
p1;
p1 = new int;
代表叫compiler 分出一個沒有名子的data 空間,位址給p1指向
空間裡面的data是未知的(亂碼)
但因為會有memory management 的問題
因此在用法上又會有delete檢查的過程
int
*
p1;
p1 = new int;
if(p1 == NULL) {
cout << "the dynamic memory is full!!!";
exit(1);
}
int
*
p1;
.......
.......
delete p1;
代表收回p1指向的data空間,但p1 pointer 還是存在
注意delete 完pointer 還是指向那裡但裡面空間存什麼就由OS決定了
而且delete 完你如果試圖去取,看(cout)裡面的值,程式會無法執行損毀
Arithmetic
計算"位址",not data
只有"+","-"
+1 , -1 代表跳過的data數目
e.g int *p = &d;
p += 4;
代表跳過4個整數(4x4= 16byte)
e.g *(num[0] + 1) 等價於 num[0][1]
FUNCTION , COMPLEX USE
typedef
typerdef int
*
cc;
cc = p1;( = int
*
p1)
用uesrer define比較不用一直寫
*
structure
struct fucking {
int man;
};
fucking dd = {3};
fucking
*
p;
p =
&dd
;
cout << p->man
== cout << (*p).man
array variables
Static
1.array variable 是pointer,指到index 0 的位址,,並且在宣告時就是分割一連串的記憶體,當你有index 0 的位址,你就知道接下來index的位址,而一般寫的a[i]就是解參考!!
2.array is o constant pointer(int
const. p)(也就是說從程式開始到結束,那個array 從宣告後就永遠指向同位址
e.g int a[10];
int
*
p;
a = p (illegal)
muti-dim
int num[2][3] = {{0,1,2},{3,4,5}};
代表num是個integer pointer,ˊ他指向的位址是個連續切割地址(即array type),現在共被連續切六格([0][0],[0][1],[0][2],[1][0],[1][1],[1][2]
default::
num,num[0] 都指到[0][0]的位址
num[1] 指到num[1][0]
by arithmetic::
int d[arraysize]
*(d+1) 等價於 d[1]
review:: default d 指向d[0]位址
int a[10];
int * p;
兩個都是pointer!!!!!
Dynamic
create
double* d;
d = new double[iSize];
則d就會指向一組array,指向index 0
delete
d = new double[iSize];
//processing
delete [] d;
d = NULL;
如果你只寫delete d ,他只會回收d[0]
若要delete 高維,就要從低維開始刪
muti
e.g
int
*
m = new int
*
[3];
m[0] = new int[4];
m[1] = new int[4];
m[2] = new int[4];
int
**
mat2;
mat2 = new int*[4];
for (int i = 0; i < 4; i++) {
mat2[i] = new int[6];
}
def::
1.a memory address
2.它是一個指向變數的地址
double *p 代表p 是一個指向double 型態data的pointer, 且不能指向其他data type
3.pointer is a integer number 但它不是整數!!!(一個是pointer type 一個是data type)