国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【C語(yǔ)言】指針詳解

wangtdgoodluck / 923人閱讀

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

前言

指針概念

  1. 指針就是個(gè)變量,用來(lái)存放地址,地址唯一標(biāo)識(shí)一塊內(nèi)存空間。
  2. 指針的大小是固定的4/8個(gè)字節(jié)(32位平臺(tái)/64位平臺(tái))。
  3. 指針是有類型,指針的類型決定了指針的+-整數(shù)的步長(zhǎng),指針解引用操作的時(shí)候的權(quán)限。
  4. 指針的運(yù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é)果:

這里str3str4指向的是同一個(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)存塊。所以str1str2不同,str3str4不同。

二、指針數(shù)組

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

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ù)組的地址,應(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;}

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

數(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ù)組的大小。

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)//這是一個(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的。

四、 數(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,一級(jí)指針的地址傳過(guò)去,要用一個(gè)二級(jí)指針接收{}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[][])//錯(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);}

4.3 一級(jí)指針傳參

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

4.4 二級(jí)指針傳參

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

相關(guān)文章

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

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

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

    摘要:參數(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...

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

    摘要:需要注意的是用矩陣形式如行列表示二維數(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)編...

    FrozenMap 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<