摘要:指針的大小是固定的個(gè)字節(jié)位平臺(tái)位平臺(tái)。二指針數(shù)組指針數(shù)組是一個(gè)存放指針的數(shù)組。是一個(gè)數(shù)組指針,該指針指向的數(shù)組有個(gè)元素,每個(gè)元素都是的。錯(cuò)誤錯(cuò)誤二維數(shù)組首元素指的是第一行。
4/8
個(gè)字節(jié)(32
位平臺(tái)/64
位平臺(tái))。+-
整數(shù)的步長(zhǎng),指針解引用操作的時(shí)候的權(quán)限。int main(){ char ch = "w"; char *pc = *ch;//pc是指向一個(gè)常量字符串 const char *p = "helloworld"; //"helloworld"是一個(gè)常量字符串,存在在內(nèi)存的常量區(qū)。不能更改 //上面表達(dá)式的意思是把常量表達(dá)式"helloworld"的第一個(gè)字符h的地址賦值給p printf("%c/n", *p);//h printf("%s/n", p);//helloworld return 0;}
int main(){ char str1[] = "hello bit."; char str2[] = "hello bit."; const char *str3 = "hello bit.";//常量字符串,不能修改 const char *str4 = "hello bit."; if (str1 == str2) printf("str1 and str2 are same/n"); //用相同的常量字符串去初始 //化不同的數(shù)組的時(shí)候就會(huì)開(kāi)辟出不同的內(nèi)存塊。所以str1和str2不同 else printf("str1 and str2 are not same/n"); if (str3 == str4) printf("str3 and str4 are same/n");//當(dāng)幾個(gè)指針指向同一個(gè)字符串的時(shí)候,他們實(shí)際會(huì)指向同一塊內(nèi)存 else printf("str3 and str4 are not same/n"); return 0;}
運(yùn)行結(jié)果:
這里str3
和str4
指向的是同一個(gè)常量字符串。C/C++
會(huì)把常量字符串存儲(chǔ)到多帶帶的一個(gè)內(nèi)存區(qū)域,當(dāng)幾個(gè)指針指向同一個(gè)字符串的時(shí)候,他們實(shí)際會(huì)指向同一塊內(nèi)存。但是用相同的常量字符串去初始化不同的數(shù)組的時(shí)候就會(huì)開(kāi)辟出不同的內(nèi)存塊。所以str1
和str2
不同,str3
和str4
不同。
指針數(shù)組是一個(gè)存放指針的數(shù)組。
char *arr[5];// arr是存放字符指針的數(shù)組 int *arr[5];// arr是存放整形指針的數(shù)組
int main(){ int a = 0; int b = 20; int c = 30; int d = 40; int *arr[4] = {&a, &b, &c, &d}; //arr就是整形指針的數(shù)組。數(shù)組共4個(gè)元素,每個(gè)元素都是int*類型 for (int i = 0; i < 4; i++) { printf("%d ", *(arr[i])); //0 20 30 40 } return 0;}
int main(){ int arr1[] = { 1, 2, 3, 4, 5 }; int arr2[] = {6, 7, 8, 9, 10}; int arr3[] = { 2, 3, 4, 5, 6 }; int *parr[] = { arr1, arr2, arr3 };//存儲(chǔ)每個(gè)數(shù)組的首地址 for (int i = 0; i < 3; i++) { for (int j = 0; j < 5; j++) { printf("%d ", parr[i][j]);//p[i] = *(p +i) //parr[i][j] = *(parr[i] +j) } printf("/n"); } return 0;}
輸出結(jié)果:
int main(){ const char *arr[5] = {"abcdef","bcdef","hehe","zhangsan","haha"}; //字符指針的數(shù)組,指針里面存儲(chǔ)每個(gè)字符串的首地址。 int i = 0; for ( i = 0; i < 5; i++) { printf("%s/n", arr[i]); } return 0;}
數(shù)組指針是指針,是能夠指向數(shù)組的指針。
int *p1[10];//指針數(shù)組int (*p2)[10];//數(shù)組指針
int main(){ int arr[10] = { 0 }; int *p = arr;//arr是數(shù)組首元素的地址 int (*parr)[10] = &arr;//取出的是數(shù)組的地址,應(yīng)該存放在數(shù)組指針中 //parr類型為int(*)[10] return 0;}
對(duì)int (*p)[10]
的解釋:
解釋:p
先和*
結(jié)合,說(shuō)明p
是一個(gè)指針變量,然后指向的是一個(gè)大小為10
個(gè)整型的數(shù)組。所以p
是一個(gè)指針,指向一個(gè)數(shù)組,叫數(shù)組指針
。
【注意】:[]
的優(yōu)先級(jí)要高于*
號(hào)的,所以必須加上()
來(lái)保證p
先和*
結(jié)合。
#include int main(){ int arr[10] = { 0 }; printf("%p/n", arr);//數(shù)組名是首元素的地址(arr arr[0]),類型為int* printf("%p/n", &arr[0]);//類型為int* printf("%p/n", &arr);//取出數(shù)組的地址(&arr) 類型為int*(10) //上面三行輸出的結(jié)果一樣,都為012FF804 printf("%p/n", arr +1); //012FF808 printf("%p/n", &arr[0] + 1); //012FF808 printf("%p/n", &arr + 1); //012FF82C 數(shù)組指針+1,跳過(guò)一個(gè)數(shù)組 return 0;}
數(shù)組名是首元素地址,但是有兩個(gè)例外:
1.sizeof(arr)/sizeof(數(shù)組名)
這里的數(shù)組名是表示整個(gè)數(shù)組,sizeof(數(shù)組名)
計(jì)算的是整個(gè)數(shù)組的大小,單位是字節(jié)
2.&(數(shù)組名)
,這里的數(shù)組名不是首元素的地址,數(shù)組名表示整個(gè)數(shù)組,所以取出的是整個(gè)數(shù)組的地址。
數(shù)組的地址+1
,跳過(guò)整個(gè)數(shù)組的大小。
void print1(int arr[], int sz){ int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); }}void print2(int* arr, int sz){ int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *(arr + i)); }}void print3(int (*parr)[10], int sz)//這是一個(gè)錯(cuò)誤的示范,這是parr指向的是整個(gè)數(shù)組,+1跳過(guò)的是整個(gè)數(shù)組{ int i = 0; for (i = 0; i < sz; i++) { printf("%d ", parr[i]);//parr[i] == *(parr+i) }}void print4(int (*parr)[10], int sz){ //*(parr + 0);-->parr[0] int i = 0; for (i = 0; i < sz; i++) { //printf("%d ", parr[0][i]); //printf("%d ", (*(parr + 0))[i]); printf("%d ", (*parr)[i]);//(*parr) 相當(dāng)于 parr指向的數(shù)組的數(shù)組名 }}int main(){ int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int sz = sizeof(arr) / sizeof(arr[0]); print4(&arr, sz); //print3(&arr, sz); //print2(arr, sz); //print1(arr, sz);//打印arr數(shù)組的內(nèi)容 return 0;}
void printf1(int arr[3][5], int r, int c){ for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { printf("%d ", arr[i][j]); } printf("/n"); }}void printf2(int (*p)[5], int r, int c){ for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { //printf("%d ", *(*(p+i)+j)); printf("%d ", p[i][j]); } printf("/n");} int main() { int arr[3][5] = { 1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7 }; //二維數(shù)組傳參 //printf1(arr, 3, 5); printf2(arr, 3, 5); //arr是數(shù)組名,數(shù)組名是首元素(二維數(shù)組的第一行)地址(是二維數(shù)組每一行的一維數(shù)組首元素的地址)可以數(shù)組指針來(lái)接收 return 0;}
int arr[5];
:整形數(shù)組
int *parr1[10]
;parr1
是一個(gè)數(shù)組,10
個(gè)元素,每個(gè)元素是int*
的,所以parr1
是一個(gè)存放指針的數(shù)組。
int (*parr2)[10]
;parr2
是一個(gè)數(shù)組指針,該指針指向的數(shù)組有10
個(gè)元素,每個(gè)元素都是int
的。
int (*parr3[10])[5]
;parr3
是一個(gè)數(shù)組,數(shù)組有10
個(gè)元素,每個(gè)元素是一個(gè)數(shù)組指針,該指針指向的數(shù)組有5
個(gè)元素,每個(gè)元素是int
的。
#include void test(int arr[])//ok{}void test(int arr[10])//ok{}void test(int *arr)//ok{}void test2(int* arr[20])//ok,20可以省略{}void test2(int** arr)//ok,一級(jí)指針的地址傳過(guò)去,要用一個(gè)二級(jí)指針接收{}int main(){ int arr[10] = {0}; int *arr2[20] = {0}; test(arr); test2(arr2);}
void test(int arr[3][5])//ok{}void test(int arr[][])//錯(cuò)誤{}void test(int arr[][5])//ok{}//總結(jié):二維數(shù)組傳參,函數(shù)形參的設(shè)計(jì)只能省略第一個(gè)[]的數(shù)字。//因?yàn)閷?duì)一個(gè)二維數(shù)組,可以不知道有多少行,但是必須知道一行多少元素。//這樣才方便運(yùn)算。void test(int *arr)//錯(cuò)誤{}void test(int* arr[5])//錯(cuò)誤{}void test(int (*arr)[5])//ok 二維數(shù)組首元素指的是第一行。{}void test(int **arr)//錯(cuò)誤{}int main(){ int arr[3][5] = {0}; test(arr);}
#include void print(int *p, int sz){ int i = 0; for(i=0; i<sz; i++) { printf("%d/n", *(p+i)); }}int main(){ int arr[10] = {1,2,3,4,5,6,7,8,9}; int *p = arr; int sz = sizeof(arr)/sizeof(arr[0]); //一級(jí)指針p,傳給函數(shù) print(p, sz); return 0;}
當(dāng)一個(gè)函數(shù)的參數(shù)部分為一級(jí)指針的時(shí)候,函數(shù)能接收什么參數(shù)?
void test1(int *p){}int main(){ int a = 10; int *p1 = &a; int arr[10] = { 0 }; test(&a); test(arr); test(p1); return 0;}
當(dāng)函數(shù)的參數(shù)為二級(jí)指針的時(shí)候,可以接收什么參數(shù)?
#include void test(int** ptr){ printf("num = %d/n", **ptr);}int main(){ int n = 10; int*p = &n; int **pp = &p; int *arr[5]; test(pp); test(&p); test(arr); return 0;}
函數(shù)指針變量:存放函數(shù)的地址
函數(shù)名
和&函數(shù)名
是一樣的。
int Add(int x, int y){ return x + y;}int main(){ //printf("%p/n", Add); int(*pf)(int, int) = &Add;//pf是用來(lái)存放函數(shù)的地址,-pf就是函數(shù)指針變量 //函數(shù)指針類型:int(*)(int, int) int ret = Add(4, 5); printf("%d/n", ret); ret = (*pf)(4, 5); //*可以沒(méi)有,也可以寫(xiě)多個(gè) ret = pf(4, 5); printf("%d/n", ret);//9 return 0;}
(*(
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/120813.html
摘要:指針變量可以存放基本類型數(shù)據(jù)的地址,也可以存放數(shù)組函數(shù)以及其他指針變量的地址。數(shù)組名表示的是整個(gè)數(shù)組所占的字節(jié)數(shù)。在這里數(shù)組指針的類型是。這也是我們可以用數(shù)組指針來(lái)接收二維數(shù)組數(shù)組名的原因。 目錄 零.前言 一.指針的定義 二.指針類型的意義 1.指針類型決定了指針解引用時(shí)一次訪問(wèn)幾個(gè)字...
摘要:參數(shù)含義上圖是函數(shù)各個(gè)參數(shù)的含義,讓我們一個(gè)個(gè)來(lái)看。使用方式頭文件要使用函數(shù)我們首先需要引用一個(gè)頭文件的實(shí)現(xiàn)函數(shù)給函數(shù)規(guī)定了特定的參數(shù)。因此我們?cè)O(shè)計(jì)函數(shù)時(shí)要嚴(yán)格遵守其參數(shù)設(shè)定。 目錄 1.參數(shù)含義 1.首元素地址base 2.元素個(gè)數(shù)num 3.元素大小size 4.自定義比較函數(shù)compa...
摘要:需要注意的是用矩陣形式如行列表示二維數(shù)組,是邏輯上的概念,能形象地表示出行列關(guān)系。再次強(qiáng)調(diào)二維數(shù)組名如是指向行的。一維數(shù)組名如是指向列元素的。 哈嘍!這里是一只派大鑫,不是派大星。本著基礎(chǔ)不牢,地動(dòng)山搖的學(xué)習(xí)態(tài)度,從基礎(chǔ)的C語(yǔ)言語(yǔ)法講到算法再到更高級(jí)的語(yǔ)法及框架的學(xué)習(xí)。更好地讓同樣熱愛(ài)編...
閱讀 2064·2021-10-11 10:59
閱讀 924·2021-09-23 11:21
閱讀 3539·2021-09-06 15:02
閱讀 1609·2021-08-19 10:25
閱讀 3364·2021-07-30 11:59
閱讀 2362·2019-08-30 11:27
閱讀 2574·2019-08-30 11:20
閱讀 2963·2019-08-29 13:15