返回

指针进阶2

发布时间:2023-02-04 02:09:07 189
#define _CRT_SECURE_NO_WARNINGS 1
//数组指针:将数值的地址存放起来
//数组指针与指针数组区别
//指针数组是用来存放数组中每一个元素地址的指针
//数组指针是用来存放数组地址的指针
//#include
//int main()
//{
// //int* p=NULL;//整形指针-指向整形指针-可以存放整形的地址
// //char* pc = NULL;//pc是字符指针-指向数组指针-存放字符地址
// //数组指针-存放数组的指针-存放数组 的地址
// //int arr[10] = { 0 };
// ////arr-首元素地址
// ////&arr[0]-首元素的地址
// ////&aar-数组的地址
// int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
// //int *p[10]=&arr;//这样的写法是错误的由于"[]"优先级高于“*”;
// //int *p;//是数组指针
// int (*p)[10] = &arr;//数组指针
// //P就是 数组指针
// return 0;
//}
//思考题目:将下面代码中的pa完整定义为数组指针
//#include
//int main()
//{
// char* arr[5];
// pa = &arr;
// return 0;
//}
//个人答题如下:
//#include
//int main()
//{
// char* arr[5];
// //char(*p)[5] =&arr;//错误:"char*(*)[5]"类型的值不能用于初始化"char(*)[5]"类型的实体
// char* (*p)[5] = &arr;//答案
// //一、"(*P)[5]"中
// //1.pa:是一个指针变量名;
// //2.“*”:说明pa是指针;
// //3.[5]:pa指向的数组是五个元素的;
// //二、char*:数组arr[5]的类型是char*
// //三、总:一个名为(*pa)的指针且类型为"char*"指向一个拥有五个元素的数组arr且类型也为"char*";
// return 0;
//}
//用法实列
// 1-普通用法(一维指针)
//#include
//int main()
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
// int(*p)[10] = &arr;
// //输出第一种方法
// //for (int i = 0; i < 10; i++)
// //{
// // printf("%d\n", (*p)[i]);
// // //数组的地址名为pa然后解引用*pa则当拿出第一个元素时候应该为“(*pa)[0]”,所以拿出数组中的所有元素应该为"(*pa)[i]";
// //}
// //第二种
// //for (int i = 0; i < 10; i++)
// //{
// // printf("%d\n", *(*p + i));//*p==arr(首元素地址)
// // //由于*p==arr(首元素地址)则向后跳i个地址打印(*p+i),然后在括号括起来(*(*p+i))解引用;
// //}
// //第三种:最常用的写法
// //int* p = arr;
// //for (int i = 0; i < 10; i++)
// //{
// // printf("%d\n",*(p+i) );
// // //名一个p==arr(首元素地址)然后在for循环中((p+i))z最后在解引用(*(p+i));
// //}
// return 0;
//}
//2-加深用法(二维指针)
//#include
//// 二维数组打印(参数是数组的形式)
//void print1(int arr[3][5], int x, int y)//int arr[3][5]-数组形式
//{
// int i = 0, j = 0;
// for (i = 0; i < x; i++)
// {
// for (j = 0; j < y; j++)
// {
// printf(" %d ", arr[i][j]);//打印出一行
// }
// printf("\n");//打印出一行后换行在打印所以在打印行的循环中
// }
//}
////利用数组指针打印二维数组(参数是指针的形式)
//void print2(int (*p)[5], int x, int y)
////int (*p)[5](数组指针)的理解:*p是一个指针,(*p)指向一个数组,(*p)[5]数组有五个元素,int (*p)[5]类型为int;
//{
// int i = 0, j = 0;
// for (i = 0; i // {
// for (j = 0; j < y; j++)
// {
// //第一种形式
// //printf(" %d ", *(*(p + i) + j));
// //*(*(p+i)+j)的理解:p:指向一行的元素,p+i:跳过i行
// //*(p+i):解引用找到p+i行拿到该行的数组名,*(p+i)+j:找到具体的第几行第几列,*(*(p+i)+j):解引用第i行第j列的元素;
// //第二种形式
// printf(" %d ", (*(p + i))[j]);//( * (p + i))[j]==(arr[i])[j]==(*(arr+i))[j]证明在下一个代码中;
// //(*(p + i))[j]的理解:p;指向一行元素,p+i:跳过i行/*(p+i):解引用找到p+i行拿到该行的数组名
// //(*(p+i)):打印每一行的元素,( * (p + i))[j]:打印每行每列的元素
// //第三种形式
// printf(" %d ",*(p[i]+j));//*(p[i]+j)==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} };
// print1(arr,3,5);//arr-数组名-首元素地址-这个首元素地址代表的是第一行的地址
// //打印二维数组的函数为“print1”,将数组"arr"传到函数中,为了方便知道行(3)和列(5)也要把行和列传入函数中;
// print2(arr, 3, 5);//arr-数组名-首元素地址-这个首元素地址代表的是第一行的地址
// //当要把二维数组的首元素地址讨论出来则需要把二维数组相信为一维数组
// //如int arr[3][5]中的第一个元素是第一行的元素,第二个元素是第二行的元素,第三个元素是第三行的元素
// //通过以上可知如果arr(首元素地址)传参传递的是第一行五个int类型元素则我们就可以把其想为一个数组指针进行输出
// return 0;
//}
////( * (p + i))[j]==(arr[i])[j]==(*(arr+i))[j]证明如下:
//#include
//int main()
//{
// int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
// int (*p)[3][5] = &arr;
// int j = 0, i = 0;
// for (i = 0; i < 3; i++)
// {
// for (j = 0; j < 4; j++)
// {
// printf(" %d ",(* (arr + i)) [j]);
// }
// printf("\n");
// }
//
// return 0;
//}
//总结
//#include
//int main()
//{
// int arr[5];//arr是一个5个元素的数组
// int* parr1[10];//parr1是一个数组,数组有10个元素,每个元素的类型是int*,parr1是指针数组
// int(*parr2)[10];//parr2是一个指针,该指针指向一个数组,数组有10个元素,每个元素的类型是int,parr2是一个数组指针;
// int((*parr3[10])[5]);//parr3是一个数组,该数组有十个元素,每个元素是一个数组指针,该数组指针指向的数组有五个元素,每个元素的类型为int
// return 0;
//}
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
%f与%lf的区别和用法 2023-02-04 01:32:20