成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【C語言】指針詳解

wangtdgoodluck / 934人閱讀

摘要:指針的大小是固定的個字節(jié)位平臺位平臺。二指針數(shù)組指針數(shù)組是一個存放指針的數(shù)組。是一個數(shù)組指針,該指針指向的數(shù)組有個元素,每個元素都是的。錯誤錯誤二維數(shù)組首元素指的是第一行。

前言

指針概念

  1. 指針就是個變量,用來存放地址,地址唯一標識一塊內(nèi)存空間。
  2. 指針的大小是固定的4/8個字節(jié)(32位平臺/64位平臺)。
  3. 指針是有類型,指針的類型決定了指針的+-整數(shù)的步長,指針解引用操作的時候的權限。
  4. 指針的運算。

一、字符指針

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;}

運行結果:

這里str3str4指向的是同一個常量字符串。C/C++會把常量字符串存儲到多帶帶的一個內(nèi)存區(qū)域,當幾個指針指向同一個字符串的時候,他們實際會指向同一塊內(nèi)存。但是用相同的常量字符串去初始化不同的數(shù)組的時候就會開辟出不同的內(nèi)存塊。所以str1str2不同,str3str4不同。

二、指針數(shù)組

指針數(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ù)組指針

3.1數(shù)組指針的定義

數(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;}

3.2 &數(shù)組名VS數(shù)組名

數(shù)組名是首元素地址,但是有兩個例外:
1.sizeof(arr)/sizeof(數(shù)組名)這里的數(shù)組名是表示整個數(shù)組,sizeof(數(shù)組名)計算的是整個數(shù)組的大小,單位是字節(jié)
2.&(數(shù)組名),這里的數(shù)組名不是首元素的地址,數(shù)組名表示整個數(shù)組,所以取出的是整個數(shù)組的地址
數(shù)組的地址+1,跳過整個數(shù)組的大小。

3.3數(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的。

四、 數(shù)組參數(shù)、指針參數(shù)

4.1 一維數(shù)組傳參

#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);}

4.2 二維數(shù)組傳參

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);}

4.3 一級指針傳參

#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;}

4.4 二級指針傳參

當函數(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ù)名&函數(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

相關文章

  • C語言指針這一篇夠了(一萬二千字,包含指針與數(shù)組,函數(shù)指針詳解

    摘要:指針變量可以存放基本類型數(shù)據(jù)的地址,也可以存放數(shù)組函數(shù)以及其他指針變量的地址。數(shù)組名表示的是整個數(shù)組所占的字節(jié)數(shù)。在這里數(shù)組指針的類型是。這也是我們可以用數(shù)組指針來接收二維數(shù)組數(shù)組名的原因。 目錄 零.前言 一.指針的定義 二.指針類型的意義 1.指針類型決定了指針解引用時一次訪問幾個字...

    My_Oh_My 評論0 收藏0
  • C語言qsort()函數(shù)的使用(詳解

    摘要:參數(shù)含義上圖是函數(shù)各個參數(shù)的含義,讓我們一個個來看。使用方式頭文件要使用函數(shù)我們首先需要引用一個頭文件的實現(xiàn)函數(shù)給函數(shù)規(guī)定了特定的參數(shù)。因此我們設計函數(shù)時要嚴格遵守其參數(shù)設定。 目錄 1.參數(shù)含義 1.首元素地址base 2.元素個數(shù)num 3.元素大小size 4.自定義比較函數(shù)compa...

    wangym 評論0 收藏0
  • C語言 指針+二維數(shù)組詳解 (應付期末、考研的最強筆記,建議收藏)

    摘要:需要注意的是用矩陣形式如行列表示二維數(shù)組,是邏輯上的概念,能形象地表示出行列關系。再次強調(diào)二維數(shù)組名如是指向行的。一維數(shù)組名如是指向列元素的。 哈嘍!這里是一只派大鑫,不是派大星。本著基礎不牢,地動山搖的學習態(tài)度,從基礎的C語言語法講到算法再到更高級的語法及框架的學習。更好地讓同樣熱愛編...

    FrozenMap 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<