指標難點 易錯點

2021-10-11 14:24:31 字數 3580 閱讀 6905

voidf(

char

**c)

intmain()

;f(c);

這裡的f(char **c) 指向指標的指標

所以呼叫時一定要 使用指標 *c[3] 定義指標陣列 c 第乙個指標變數的位址。

指標的位址 用指向指標的指標存放

二、例如:int a[3][4]=

// ptr2是乙個指向 int * 的指標,即ptr2的型別和&ptr是一樣的,注意:ptr指向的記憶體區域不定長

int * ptr2[3]=; //這是乙個指標陣列

// ptr3是乙個指向 int [3] 的指標,即ptr3的型別和&arr1的型別是一樣的,注意:arr1指向的記憶體區域定長

int(* ptr3)[3]=&arr1;這是乙個行指標

// ptr3=ptr2;//error 無法從「int [3]」轉換為「int ()[3]二者的儲存位址型別不同,儘管位址數字相同,型別不同,不能轉化賦值。

int ** ptr4;

//ptr4=&arr1; //error 無法從「int (*)[3]」轉換為「int**"//arr1 是二維陣列

//這些**將相互的關係表明了

int arr1[3]

;int arr2[3]

;int arr3[3]

;int

* ptr;

// ptr1是乙個指向 int [3] 的指標,即ptr1的型別和&arr1的型別是一樣的,注意:arr1指向的記憶體區域定長

int ptr1[3]

[3]=

,,};

// ptr2是乙個指向 int * 的指標,即ptr2的型別和&ptr是一樣的,注意:ptr指向的記憶體區域不定長

int* ptr2[3]

=;//指標陣列,指標存放指標,即為指向指標的指標。 與**p 同型別

// ptr3是乙個指向 int [3] 的指標,即ptr3的型別和&arr1的型別是一樣的,注意:arr1指向的記憶體區域定長

int(

* ptr3)[3

]=&arr1;

ptr3=ptr1;

// 沒錯,他們的型別相同

// ptr3=ptr2;//error 無法從「int *[3]」轉換為「int (*)[3]

// ptr4是乙個指向 int * 的指標,即ptr4的型別和&ptr是一樣的,注意:ptr指向的記憶體區域不定長

int*

* ptr4;

//ptr4=&arr1; //error 無法從「int (*)[3]」轉換為「int ** ***非常重要***

ptr4=ptr2;

// 沒錯,他們的型別相同

//ptr4=ptr3; // error 無法從「int (*)[3]」轉換為「int **

return0;

}

陣列名就是指標嗎?

由圖知,陣列名跟指標還是有區別的,但是值是相同的,存放的資料型別也相同,但是二者的記憶體空間不同。

一般指標位元組數為四;sizeof 表示該「 」所佔的最大位元組數;也就是記憶體?

許多程式設計師以為sizeof是乙個函式,而實際上,它是乙個操作符,不過其使用方式看起來的確太像乙個函式了。語句sizeof(int)就可以說明sizeof的確不是乙個函式,因為函式接納形參(乙個變數),世界上沒有乙個c/c++函式接納乙個資料型別(如int)為"形參"。

int x[5]; int *p=&x; //為什麼會報錯? 因為型別不匹配。 p的型別是int,而&x的型別卻不是int。 &x的型別實際上是int()[5],因為去的是x的位址,也就是說這個位址是陣列的位址

int x[5];中的x到底是什麼呢,我們說x是陣列,此陣列有5個元素,並且每個元素都是int型別。 我們有乙個識別資料型別的規律例如: int x; //x型別為int

int *x;//x型別為int *

intx;//x型別為int **

int (x)[10];//x型別為int()[10]實際上是指向陣列的指標

int (x)(int ,int);//x的型別為int()(int,int)實際上是指向函式的指標

由此可以看出,乙個符號是什麼資料型別,我們只要在其定義的表示式中去掉符號本身,剩下的就是符號的型別了。照此推斷,int x[5];中x的型別應該是 int [5]這個型別,可以看出此型別並不是int *型別。

int a[2][3]; intp=&a; //這裡我用&a來賦值行不行呢。是不行的。 這裡為什麼是錯誤的,原因就是因為&a的型別不是int**型別。所以型別不相容,導致不能賦值,同時這兩種型別是不可以相互轉換的。

指標 位址的加減 什麼時候是位運算 什麼時候是值運算

#define _crt_secure_no_warnings

#include

intmain()

;int

* p;

for(p = a[0]

; p < a[0]

+12; p++

)printf

("\n");

return0;

}

+1= +4 這時是位運算

值運算就是位址數字的加減。

字元型陣列指標與整形指標陣列區別:(準確來說是全部整形與字串 資料 有存在的問題)

常量例外:

若 char str=「adasdas」

int a=90;

這時printf輸出直接變數名就行。

陣列名代表的是首元素位址,假如

char p1[3]=;

int p2[4]=;

而printf(「%d」,p2) 則是輸出位址。

printf(「%s」,p1)則是字串,到『\0』\結束。

不過這時如果用p1[1],p2[1],則正常;

#define _crt_secure_no_warnings

#include

intmain()

;char p2[3]

=;printf

("%d\n"

, p1[1]

);printf

("%c\n"

, p2[1]

);return0;

}

對應**除錯,手懶族自取;

下面才是最重要的部分:

指標變數,指標陣列

int a[2][3]; int (*p)[2][3]=&a 二維陣列指標 及賦初值;

&a,a,a[0],三者雖然儲存的資料相同,但是他們的型別不同;

int (*p)[n]=&a,錯了;

int (*p)[n]=a;對

int *p=a[n] 對 int *p=*a,對;

C語言易錯點及難點

獲得字串長度 strlen s 需要標頭檔案 include 判斷兩個字元是否相等用 判斷兩個字串相等 if strcmp s1,s2 0 strcmp s1,s2 相等返回0 想要輸入帶空格用gets s 標頭檔案stdlib.h中的方法atoi可以實現字串轉數字 996 轉為996 includ...

C 指標易錯點梳理

1 指標定義 指標是乙個變數 指標的值是另乙個變數的位址。變數的宣告 type var name var name是指標變數的名稱。星號是用來指定乙個變數var name是指標變數。int ip 變數ip是乙個整型的指標 include using namespace std intmain val...

php面試題 難點易錯點(一)

前言 錄製一 php負數求餘及布林型別初探 1.php求余中的負數 8 3 2 8 3 2 8 3 22.php中奇怪的布林型別 a true a echo a.1 a 1 echo a 2 b true b 1 echo b 2 4.前端收到賬號資訊會展示出來。7.網頁端拿到token就可以登陸成...