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就可以登陸成...