pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

一篇文章帶你了解C語言指針進階

這篇文章主要介紹了C語言指針詳解及用法示例,介紹了其相關概念,然后分享了幾種用法,具有一定參考價值。需要的朋友可以了解下

1.字符指針

我們已經知道了數組名在大部分時候表示數組的地址,指針本質上也表示一個地址,那么我們能否用指針來創建一個字符串呢?


int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	const char* p1 = "abcdef";
	const char* p2 = "abcdef";//const可省略,默認為常量字符串
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", p1);
	printf("%s\n", p2);
	return 0;
}

需要注意的是字符指針創建的字符串是常量字符串,普通的字符串只要數組名不同即使字符串內容相同,也是不同的字符串,但是不論用多少個指針創建字符串,只要字符串內容相同,所有指針指向的就是同一個字符串,因此字符指針指向的字符串不能修改,在沒有const修飾的情況下也是如此。

2.指針數組

我們知道數組可以存儲整形,浮點型,或自定義的結構體,那么可不可以存儲指針呢?答案是:可以。元素都為指針的數組就稱為指針數組,形式為:數據類型* 數組名[ ],例如:儲存整形指針的指針數組創建成int*p[10],表示的就是一個包含十個指針元素的數組,利用指針數組我們可以訪問指針數組內的指針進而操作變量或其他數組。


int main()//利用指針數組分別遍歷三個數組
{
	int arr1[] = { 1, 2, 3, 4, 5 };
	int arr2[] = { 2, 3, 4, 5, 6 };
	int arr3[] = { 3, 4, 5, 6, 7 };
	int*parr[] = { arr1, arr2, arr3 };
	int i, j;
	int Sz = sizeof(parr) / sizeof(parr[0]);
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (i = 0; i < Sz; i++)
	{
		for (j = 0; j < sz; j++)
		{
			printf("%d ",*(parr[i]+j) );
		}
		printf("\n");
	}
}

3.數組指針

我們知道指針可以指向整形,浮點型,或自定義的結構體,那么能不能指向數組呢?答案也是:可以。指向數組的指針稱為數組指針,形式為:數據類型(*p)[ ] ,例如int(*p)[10],表示的就是一個指向包含十個元素數組的指針,這和指針數組的區別在于要將*p用小括號括起來以確保它是一個指針而非數組(無括號的情況下p先和 [ ]結合)。


int main()利用數組指針遍歷數組
{
	int arr[6] = { 1, 2, 3, 4, 5, 6 };
	int(*p)[6] = &arr;
	int i;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i=0;i<sz;i++)
	printf("%d", (*p)[i]);
	//int*arr[5];
	//int*(*p)[5]=&arr;//int(*p[10])[5]-->p[10]是一個指針數組,剩下int(*  )[5]的是數組的類型,類型為數組指針,p是一個數組有十個元素,每個元素都是一個數組指針,指向的數組有五個int類型的元素
	return 0;
}

有了指針數組和數組指針,我們還可以進行兩者的嵌套使用,例如:數組指針數組(int(*p[ ])[ ]),指針數組指針(int*(*p)[ ]),前者是一個數組里面的元素是指向另外一些數組的指針,后者是個指針指向一個元素全為另外一些指針的數組。


void print(int(*p)[5],int x,int y)//用數組指針接收數組地址
{
	int i,j;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			printf("%d ", *(*(p + i) + j));//arr[i]==*(arr+i)==*(p+i)==p[i]
		}
		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);//arr是首元素地址,二維數組的首元素是個第一行的一維數組
	return 0;
}

4.函數指針

我們知道指針可以指向整形,浮點型,自定義的結構體和數組,那么能不能指向一個函數呢?答案同樣是:可以。函數指針的形式為:函數返回類型(*p)(參數類型,參數類型....)例如:int(*p)(int,int)表示的就是一個指向返回類型為整形,兩個參數類型也是整形的函數的指針。注意:利用函數指針調用函數時有幾個解引用操作符都可以沒有也可以,但是括號不可或缺!


int Mul(int x, int y)
{
	return x*y;
}
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	int(*p)(int,int) = &Mul;//函數指針,有無&都可以
	printf("%d", (p)(a, b));//用指針調用函數(*(void(*)()0))()
	printf("%d", (*p)(a, b)); 
	printf("%d", (**p)(a, b));
	printf("%d", (***p)(a, b));//任意個數的*都可以
	return 0;
}

5.數組傳參

我們知道簡單的一維數組的傳參方式:數組名是首元素地址,我們可以直接用指針接收也可以直接用數組接收,那么指針數組和二維數組呢?指針數組傳參傳的也是其首元素的地址,而它的首元素是一個指針,指針的地址我們當然用二級指針接收,同樣地我們也可以直接指針數組接收。二維數組傳參傳的是其首元素的地址,要注意的是,二維數組的首元素并不是第一個元素而是第一行元素所構成的一維數組,一維數組的地址我們當然用數組指針接收,同樣地,我們也可以直接用二維數組接收。


void test1(int arr[])//直接數組接收
{
	printf("%d\n", arr[]);
}
void test2(int*arr)//指針接收首元素地址
{
	printf("%d\n", arr[]);
}
void test3(int arr[][5])//二位數組直接接收
{
	printf("%d\n", arr[][5]);
}
void test4(int(*arr)[5])//數組指針接收
{
	printf("%d\n", arr);
}
void test5(int*arr[])//直接指針數組接收
{
	printf("%d\n", arr);
}
void test6(int**arr)//二級指針接收
{
	printf("%d\n", arr);
}
int main()
{
	int arr1[5] = {1,2,3,4,5};
	int arr2[3][5] = {1,2,3,4,5};
	int* arr3[5] = {NULL};
	test1(arr1);
	test2(arr1);
	test3(arr2);
	test4(arr2);
	test5(arr3);
	test6(arr3);
	return 0;
}

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注html5模板網的更多內容!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

這篇文章主要介紹了C語言指針引用數組案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
主站蜘蛛池模板: 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 航空连接器,航空插头,航空插座,航空接插件,航插_深圳鸿万科 | ASA膜,ASA共挤料,篷布色母料-青岛未来化学有限公司 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 脱硝喷枪-氨水喷枪-尿素喷枪-河北思凯淋环保科技有限公司 | 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 | 工业PH计|工业ph酸度计|在线PH计价格-合肥卓尔仪器仪表有限公司 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | TTCMS自助建站_网站建设_自助建站_免费网站_免费建站_天天向上旗下品牌 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 包塑软管|金属软管|包塑金属软管-闵彬管业 | 直流大电流电源,燃料电池检漏设备-上海政飞 | 杭州火蝠电商_京东代运营_拼多多全托管代运营【天猫代运营】 | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | 玄米影院| 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 协议书_协议合同格式模板范本大全| 砖机托板价格|免烧砖托板|空心砖托板厂家_山东宏升砖机托板厂 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 | RFID电子标签厂家-上海尼太普电子有限公司 | 石膏基自流平砂浆厂家-高强石膏基保温隔声自流平-轻质抹灰石膏粉砂浆批发-永康市汇利建设有限公司 | 济南办公室装修-厂房装修-商铺装修-工装公司-山东鲁工装饰设计 | 丹佛斯变频器-Danfoss战略代理经销商-上海津信变频器有限公司 | 工业用品一站式采购平台|南创工品汇-官网|广州南创 | 手术示教系统-数字化手术室系统-林之硕医疗云智能视频平台 | 凝胶成像仪,化学发光凝胶成像系统,凝胶成像分析系统-上海培清科技有限公司 | 玻璃钢格栅盖板|玻璃钢盖板|玻璃钢格栅板|树篦子-长沙川皖玻璃钢制品有限公司 | 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 德国BOSCH电磁阀-德国HERION电磁阀-JOUCOMATIC电磁阀|乾拓百科 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 361°官方网站| 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 定量包装秤,吨袋包装称,伸缩溜管,全自动包装秤,码垛机器人,无锡市邦尧机械工程有限公司 | 电机修理_二手电机专家-河北豫通机电设备有限公司(原石家庄冀华高压电机维修中心) | 潜水搅拌机-双曲面搅拌机-潜水推进器|奥伯尔环保 | 杭州|上海贴标机-百科 |