1.1(1)在c++中常量可分為6種,它們是整型常量、實型常量、字元型常量、字串常量、符號常量、邏輯型常量
(2)const在前,內容不能變;
const在後,指標不能變;
const* ,指標指向為常量;
*const ,指標本身為常量
1.2把*讀作"pointer to",從右至左唸:
(1)b是乙個常量
const int b; /* b is a int const */
int const b; /* b is a const int */
(2)p是乙個普通指標,指向乙個常量
const int *p; /* p is a pointer to int const */
int const *p; /* p is a pointer to const int */
(3)p是乙個常量指標,指向乙個普通變數
int *const p; /* p is a const pointer to int */
(4)p是乙個常量指標,指向乙個常量
const int *const p; /* p is a const pointer to int const */
int const *const p; /* p is a const pointer to const int */
(5)具有相同型別的指標型別變數p與一維陣列a,不能進行的操作是(d)
a****:** **陣列名a型別為int \*,與指標變數p是相同型別**,可以進行賦值操作;
**b****:a[0]與\*p都是int 型**,可以進行賦值操作;
**c****:&a[0] 的型別為int \*,與指標變數p是相同型別**,可以進行賦值操作;
**d****: &a的型別為 int (\*) [n],即指向陣列的指標,與指標變數p不是相同型別,因此無法進行賦值操作**
(6)
int main()
解析:const在前,內容不能變;
const在後,指標不能變;
const* ,指標指向為常量;
*const ,指標本身為常量
1)const int*p1:表示不能通過指標p1修改它指向的記憶體單元的值,但是p1本身可修改。
(2)int const*p2=&i:與p1相同,即不能修改p2指向的記憶體單元的值,但是可以修改p2使其指向其它的記憶體單元。這裡p2指向了整型變數i
(3)p2=&j:修改p2,使其指向整型變數 j ,由(2)可知(3)沒錯。
(4)int *constp3=&i:p3本身是指向整型變數的常指標,即p3初始化後不能再指向其它的記憶體單元,但是可以修改p3指向的記憶體單元的值。這裡p3指向了整型變數i。
(5)*p3=20:通過p3將變數i的值修改為2,由(4)可知(5)沒錯。
(6)*p2=30:通過p2修改它所指向的記憶體單元的值,由(2)可知(6)錯誤。
(7)p3=&j:修改p3,使其指向j,由(4)可知(7)錯誤。
1、int(*p)[4];------ptr為指向含4個元素的一維整形陣列的指標變數(是指標)
2、int *p[4];-------定義指標陣列p,它由4個指向整型資料的指標元素組成(是陣列)
3、int(*)[4];--------實際上可以看作是一種資料型別。也就是第乙個(int(*p)[4];)
int (*p)[4]: ()優先順序高 *p 首先是乙個指標,型別是int,後面的 [4]表明這是乙個指向一維整型陣列的指標
int *p[4]: 優先順序高, p[4] 首先是乙個陣列,型別是 int * ,也就是這是乙個存放4個整型指標的陣列p
(1)對char*p="hello』; char p字串陣列的理解。
若char* p=「hello」;實際上p是乙個指標,指向的內容是字串常量hello,指向的內容是不可修改的!如果執行*p+1='f』操作是錯誤的!
因為p是指標,可以讓p指向別的內容,如p=「china」 是正確的。
char p=「hello」;實際上是乙個字串陣列初始化的方式,字串陣列的有兩種初始化方式,一種是這樣的初始化,另外一種是列表初始化;
而p可以理解為是乙個常量指標,p的值不可修改,如p++操作是錯誤的。
char a[10]=「china」;
char a[10],*p=a;p=「china」;
char *a;a=「china」;
char a[10],*p;p=a=「china」;
a.是最常見的一種初始化方式。
b.p是乙個指標,一開始指向的是乙個字元陣列a,後改變p指向了字元常量"china"
c.a是乙個指標,指向了字元常量」china』』,是正確的。但是如果定義**char a[10];a=「china」;**是錯誤的!這相當於是陣列的複製,而在c中並不存在陣列複製的內建方法!
**d.**明顯是錯誤的。
(2)可以把 ptr當作乙個整體,指向乙個char 的字串,然後注意下面這些情況:
1 2 3 4
*ptr = arr[0] = 「hello」 (*ptr)[1] = arr[0][1] = 『e』 (*ptr + 1) = arr[0][1:] = 「ello」 *(ptr + 1) = arr[1] = 「world」
· *p++ 先取指標p指向的值(陣列第乙個元素2),再將指標p自增1
· (*p)++ 先去指標p指向的值(陣列第乙個元素2),再將該值自增1(陣列第乙個元素變為3)
· *++p 先將指標p自增1(此時指向陣列第二個元素), 操作再取出該值
· ++*p 先取指標p指向的值(陣列第乙個元素2),再將該值自增1(陣列第乙個元素變為3)
c2.a
(*p).a
p->a
例題:
#include #include #include void getmemory(char*p)
int main( )
上述**執行會出現錯誤,主要原因如下:
指標指向常量(如char*str=「aaaaa」)和null時,不能通過指標修改常量,因為常量本身就是唯讀的。
退一步來講,getmemory函式中,p一開始跟str指向同乙個位置,經過「 p=(char*) malloc(100);」這句話之後p已經指向了動態開闢的空間的首位址,「strcpy(p,「hello world」);」操作針對的是動態開闢的空間,而不是str指向的位址空間了,getmemory函式執行完成後p又自動釋放了,所以getmemory函式對str指向的位址空間沒有實際的操作。
綜上可知,str指向的內容未發生變化,故輸出null。
6.1下面程式的功能是從輸入字串中找出最長字串,則下面程式哪行存在錯誤( )
#include "stdio.h"
#include "string.h"
#define n 10
int main()
, (*ptr)[2], i, j;
for (i = 0; i < 2; i++)
for (i = 0; i < 3; i++)
return 0;
}
首先,第乙個for迴圈只迴圈了2次,所以3沒有讀入。其次,第一次ptr=a+0表示指向陣列a的第一行第乙個元素,即a[0][0],所以 a[0][0]=1,ptr++,ptr指向下一行(注意,不是下乙個),但是由於第二次迴圈時 ptr=a+1,ptr被覆蓋了,所以,ptr++並沒有用,所以ptr是指向陣列a的第二行,所以 a[1][0]=2。
6.4
#include#includeusing namespace std;
int main(int argc, int ar**)
; cout << sizeof(*str[0]) << " " << typeid(str[0]).name() << " " << *(str[0] + 1) << endl;//typeid是型別
cout << sizeof(*&str[0]) << " " << typeid(&str[0]).name() << " " << *(&str[0] + 1) << endl;
cout << sizeof(*str) << " " << typeid(str).name() << " " << *(str + 1) << endl;
cout << sizeof(*&str) << " " << typeid(&str).name() << " " << *(&str + 1) << endl;
return 0;
}
執行結果:
1 ``char` `* e
4 ``char` `* * world
4 ``char` `* [3] world
12 ``char` `* (*)[3] 00f7f734
能看懂這個你就知道了,這個地方+1的時候都是說步長,
步長就是說+1前面的這個物件 所指向的 資料型別的長度,
比如 &str[0]型別是``char` `* * 所指向的是``char` `*
長度是指標的長度(不同機器不同)
C C 指標常量和常量指標
常量指標 常量指標是指向常量的指標,指標指向的記憶體位址的內容是不可修改的。常量指標定義 const int p a p 告訴編譯器是常量,不能將 p作為左值進行操作。但這裡的指標p還是乙個變數,它的內容存放常量的位址,所以先宣告常量指標再初始化是允許的,指標也是允許修改的,例如 int a 0,b...
常量指標和指標常量 C C
按英文的字面意思,從右向左理解就比較清楚了 const char pointer 常量指標 底層const pointer to const 字面意思 指向常量的指標,不能通過這個指標修改指向的內容 char const pointer 指標常量 頂層const const pointer 字面意思...
C,C 指標和常量
常量使用關鍵字const修飾,如定義乙個整型常量 const int a 10 定義常量 兩種 define pi 3.14 巨集定義 const int maxscore 100 const 指向常量的指標。定義如下兩種方式都行指向常量的指標的特點 1 無法通過指標修改指向的資料 2 可以修改指標...