真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C語言學(xué)習(xí)備忘錄-指針進(jìn)階-各類型指針對比-創(chuàng)新互聯(lián)

各類型指針對比

(特別鳴謝@比特鵬哥)

翔安網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,翔安網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為翔安成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的翔安做網(wǎng)站的公司定做!目 錄 字符(串)指針 數(shù)組指針 數(shù)組傳參和指針傳參 函數(shù)指針 函數(shù)指針數(shù)組 總結(jié)大合集

############################################################################################################

字符(串)指針 指向字符(串)的指針
int main()
{char ch = 'q';
	char* pc = &ch;
	printf("%c %p %c\n", ch, pc, *pc);
	char* ps = "hello world";// 本質(zhì)上是把字符串"hello world"的首元素地址放到*ps指針中
	char arr[] = "hello world";
	printf("%c\n", *ps);
	printf("%s\n", ps);
	printf("%c\n", arr[0]);
	printf("%s\n", arr);
	
	// 面試題
	char str1[] = "hello world";
	char str2[] = "hello world";
	char* str3 = "hello world";
	char* str4 = "hello world";// 常量池中的字符的地址相同 (這個地方還有待商榷,學(xué)藝不精待深入學(xué)習(xí)后再作解釋)
	if (str1 == str2)// 數(shù)組名為數(shù)組首元素地址
	{printf("str1 is same to str2\n");
	}
	else
	{printf("str1 is not same to str2\n");
	}
	if (str3 == str4)
	{printf("str3 is same to str4\n");
	}
	else
	{printf("str3 is not to str4\n");
	}
	return 0;
}

運行結(jié)果:

數(shù)組指針 數(shù)組指針本質(zhì)上是一種指針
int main()
{int arr[10] = {1,2,3,4,5 };// arr是數(shù)組首元素的地址 - arr[0]的地址
	int(*parr)[10] = &arr;// &數(shù)組名->取出的是整個數(shù)組的地址 parr就是一個數(shù)組指針 - parr中存放的就是這個數(shù)組的地址
	return 0;
}
(有關(guān)的題外話)

數(shù)組名就是數(shù)組首元素地址
But兩個例外:
1、sizeof(數(shù)組名) ->數(shù)組名表示整個數(shù)組,計算的是整個數(shù)組的大小,單位是字節(jié)byte
2、&數(shù)組名 ->數(shù)組名表示整個數(shù)組,取出的是整個數(shù)組的地址

int main()
{int arr[10] = {0 };
	int* p1 = arr;
	int(*p2)[10] = &arr;
	printf("%p %p\n", arr, &arr);// 數(shù)組的首元素地址 = 數(shù)組的地址
	printf("%p %p\n", p1, p2);
	printf("%p %p\n", p1 + 1, p2 + 1);// 跨4字節(jié)(跨了一個數(shù)組元素) 跨40字節(jié)(跨了一整個數(shù)組)
	return 0;
}

運行結(jié)果:

數(shù)組指針的使用 一維數(shù)組
int main()
{// 一般不用于一維數(shù)組
	int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
	int(*pa)[10] = &arr;
	int i = 0;
	for (i = 0; i< 10; i++)
	{printf("%d ", *((*pa) + i));
		// pa存放的是數(shù)組的地址,解引用(*pa)即得到arr數(shù)組名即*pa=arr,arr為數(shù)組首元素地址,解引用(*((*pa) + i))即一一取出數(shù)組中的元素
	}
	return 0;
}

運行結(jié)果:

二維數(shù)組
// p是一個指向一維數(shù)組的指針 - *p = arr[i](i = 0,1,2)
void print(int (*p)[5], int r, int c)
{int i = 0;
	int j = 0;
	for (i = 0; i< r; i++)
	{for (j = 0; j< c; j++)
		{	printf("%d ", *(*(p + i) + j));
			// p ->第1行的一維數(shù)組的地址(整個數(shù)組)
			// *p ->第1行的一維數(shù)組名
			// p + i<=>第(1+i)行的一維數(shù)組的地址
			// *(p + i)<=>arr[i][5] - 第(1+i)行一維數(shù)組的數(shù)組名
			// *(p + i) + j<=>第(1+i)行的一維數(shù)組名+j = 第(1+i)行的一維數(shù)組的首元素地址+j = 第(1+i)行(1+j)列元素的地址
			// *(*(p + i) + j)<=>第(1+i)行(1+j)列元素
		}
		printf("\n");
	}
}
int main()
{int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	print(arr, 3, 5);// 二維數(shù)組的首元素是指第一行
	return 0;
}

運行結(jié)果:

數(shù)組傳參和指針傳參 一級指針傳參
void print(int* ptr, int sz)
{int i = 0;
	for (i = 0; i< sz; i++)
	{printf("%d ", *(ptr + i));
	}
}
void test(char* p)
{;
}
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	// p是一級指針 - 一級指針傳參一級指針接收
	print(p, sz);
	char ch = 'w';
	char* p1 = &ch;
	test(&ch);
	test(p1);
	return 0;
}

運行結(jié)果:

二級指針傳參
void test(int** p2)
{// *p2 ->pa ->*pa ->a
	**p2 = 20;
}
int main()
{int a = 10;
	int* pa = &a;// pa是一級指針
	int** ppa = &pa;// ppa是二級指針
	// 把二級指針進(jìn)行傳參
	test(ppa);
	test(&pa);// 傳一級指針變量的地址
	int* arr[10] = {0 };
	test(arr);// 傳一級指針數(shù)組/傳存放一級指針的數(shù)組
	printf("%d\n", a);
	return 0;
}
函數(shù)指針
int Add(int x, int y)
{return x + y;
}
int main()
{// 函數(shù)指針 - 存放函數(shù)地址的指針
	// &函數(shù)名 - 取到的就是函數(shù)的地址
	printf("%p\n", &Add);
	printf("%p\n", Add);
	// 數(shù)組名 != &數(shù)組名<->函數(shù)名 == &函數(shù)名 ==*函數(shù)名
	// pf就是一個函數(shù)指針變量
	int (*pf)(int,int) = &Add;
	return 0;
}

運行結(jié)果:

調(diào)用函數(shù)指針
int Add(int x, int y)
{return x + y;
}
int main()
{int (*pf)(int,int) = Add;
	int ret = (*pf)(3, 5);
	int ret = pf(3, 5);
	int ret = Add(3, 5);
	// Add == *pf == pf ==****....***pf - 我不理解但我大受震撼
	// 函數(shù)名本身也是一個地址
	printf("%d\n", ret);
	// void(*)() - 函數(shù)指針類型
	// (void(*)())0 - 對0進(jìn)行強制類型轉(zhuǎn)換,被解釋為一個函數(shù)地址
	// *((void(*)())0) - 對0地址進(jìn)行了解引用操作
	// (*((void(*)())0)(); - 調(diào)用0地址處的函數(shù)

	// void (*)(int) - 函數(shù)指針類型
	// signal(int, void (*)(int)) - signal()函數(shù),函數(shù)參數(shù)1是int類型,函數(shù)參數(shù)2是函數(shù)指針類型(返回類型void,參數(shù)是int)
	// void (* signal(int, void (*)(int)))(int) - void (*signal())(int) - signal函數(shù)指針類型,返回值是void,參數(shù)是int
	return 0;
}
函數(shù)指針數(shù)組

存放函數(shù)指針的數(shù)組

int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int main()
{int (*pf1)(int, int) = Add;
	int (*pf2)(int, int) = Sub;
	int (*pfArr[2])(int, int) = {Add,Sub };// pfArr是一個函數(shù)指針數(shù)組 - 存放同類型的函數(shù)指針
	return 0;
}
總結(jié)大合集
// 常規(guī)int*指針
int* p = &a;
// 字符串指針
char* pc = &ch;
// 數(shù)組指針
int(*pa)[10] = &arr;
// 函數(shù)指針
int (*pf)(int,int) = &Add;
// 函數(shù)指針數(shù)組
int (*pfArr[2])(int, int) = {Add,Sub };

(其實就是對比一下幾種指針長啥樣子,因為學(xué)的太多太深然后逐漸分不清,腦袋一片漿糊,分類學(xué)完后再總結(jié)對比一下,會有新發(fā)現(xiàn))

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


本文名稱:C語言學(xué)習(xí)備忘錄-指針進(jìn)階-各類型指針對比-創(chuàng)新互聯(lián)
文章鏈接:http://weahome.cn/article/dssphi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部