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