C C 指標 常量

2021-10-09 07:05:34 字數 4641 閱讀 3411

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 可以修改指標...