入门学习计算机第十六天——指针进阶(一)
发布日期:2021-06-28 16:38:48
浏览次数:3
分类:技术文章
本文共 2716 字,大约阅读时间需要 9 分钟。
入门学习计算机第十六天——指针进阶(一)
编译器:Microsoft Visual Studio 2010
前言
字符指针
字符指针: char*
int main(){ char* p ="abcdef";//"abcdef"是一个常量字符串,指针内存放的是首元素的地址。 printf("%c\n",*p); printf("%s\n",p); return 0;}
输出的结果是
a abcdef有一道笔试题:
int main(){ char arr1[]= "abcdef"; char arr2[]= "abcdef"; const char* p1 ="abcdef"; const char* p2 ="abcdef"; if(arr1 == arr2) { printf("hehe\n"); } else { printf("haha\n"); } if(p1 == p2) { printf("hehe\n"); } else { printf("haha\n"); } return 0;}
输出的结果是
haha hehe为什么输出haha?
arr1 与 arr2 是两个数组,创建了两个不同的空间,所以两个数组的首元素地址也不相同。 为什么输出hehe? p1与p2指向的是同一个常量字符串,并且内容都是不可修改的。C会把常量字符串储存到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际指向同一块内存,所以p1,p2指向的是一个空间,所以是相等的。指针与数组
指针数组
主体是数组
int* arr[10];//整型指针的数组 char* arr2[4];//一级字符指针的数组 char** arr3[5];//二级字符指针的数组int main(){ char arr1[] = { 1,2,3,4,5}; char arr2[] = { 2,3,4,5,6}; char arr3[] = { 3,4,5,6,7}; const char* parr []= { arr1, arr2 ,arr3}; int i =0; for(i = 0; i < 3 ; i++) { int j = 0; for(j = 0; j <5; j++) { printf("%d", *(parr[i]+j)); } printf("\n"); } }
数组指针
主体是指针
数组指针,能够指向数组的指针int main(){ int* p =NULL;//p是整型指针,指向整型的指针,存放整型的地址 char* pc = NULL;//pc是字符指针,指向字符的指针,存放字符的地址 int arr[10]={ 1,2,3,4,5,6,7,8,9,10}; int(*p)[10] = &arr;//数组的地址要存起来 //上面的p就是数组指针,p先和*结合,说明p是一个指针变量,然后指向的是一个大小为10个整型的数组 return 0;}
void print(int arr[3][5],int x ,int y){ int i = 0; int j =0; for(i = 0; i
输出的结果都是
12345 23456 34567由上述的代码可知
printf("%d ",p[i][j]);printf("%d ",*(p[i]+j));printf("%d ",*(*(p+i)+j));printf("%d ", *(p+i)[j]); //四种方式都等价
int arr[5];
arr是一个5个元素的整型数组
int* parr1[5];
parr1是一个数组,数组内有5个元素,每一个元素的类型是Int* ,parr1是一个指针数组
int (*parr2)[5];
parr2是一个指针,该指针指向一个5个元素的整型数组
int(*parr3[10])[5];
parr3是一个数组,该数组有10个元素,每一个元素是一个数组指针
该数组指针指向的数组有5个元素,每个元素的类型是int数组参数,指针参数
一维数组传参
void test(int arr[]){ }void test(int arr[10]){ }void test(int* arr){ }void test2(int *arr[20]){ }void test2(int **arr)//所有函数的传参都是正确的{ }int main(){ int arr[10] = { 0}; int *arr2[20] = { 0}; test(arr); test2(arr2); return 0}
二维数组传参
void test(int *arr)//err{ }void test(int* arr[5])//err{ }void test(int (*arr)[5])//正确{ }void test(int **arr)//err{ }int main(){ int arr[3][5]={ 0}; test(arr);}
一级指针传参
void print(int *p , int sz){ int i = 0; for(i=0; i
思考:test和test2能接收什么参数
void test(int* p){ }void test2(char* p){ }
int a =10;test(&a);//或者int a =10;int *p =&a;test(p);//test2同理
二级指针传参
void test(int** ptr){ printf("num= %d\n", **ptr);}int main(){ int n =10; int* p =&n; int **p =&p; test(pp); test(&p); int* arr[10]; test(arr);//指针数组也可以 return 0;}
转载地址:https://blog.csdn.net/xiaotangyu7dong/article/details/116088907 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月19日 09时03分57秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
农民工看完都会了!Flutter尽然还能有这种操作!终获offer
2019-04-29
安卓开发api!Android面试中常问的MMAP到底是啥东东?附面试题答案
2019-04-29
安卓开发入门视频!你了解过移动端适配吗?复习指南
2019-04-29
安卓开发实战!零基础如何成为高级Android开发,架构师必备技能
2019-04-29
安卓开发实训心得!整理出这份8万字Android性能优化实战解析,持续更新中
2019-04-29
安卓app开发框架!写给即将正在找工作的Android攻城狮,成功入职阿里
2019-04-29
安卓app开发环境搭建!Android最强保活黑科技的最强技术实现,完整PDF
2019-04-29
安卓app软件开发教程!免费Android高级工程师学习资源,值得收藏!
2019-04-29
安卓chrome插件开发!Android架构师教你如何突破瓶颈,跳槽薪资翻倍
2019-04-29
安卓rom开发教程!跟Android初学者分享几点经验,写给正在求职的安卓开发
2019-04-29
原理解析!2021年教你增加拿到BAT等大厂offer几率,offer拿到手软
2019-04-29
原生安卓开发!驱动核心源码详解和Binder超系统学习资源,实战篇
2019-04-29
大牛手把手带你!2021年Android进阶者的新篇章,完整PDF
2019-04-29
太牛了!Android程序员最大的悲哀是什么?面试真题解析
2019-04-29
作为字节跳动面试官,BAT这种大厂履历意味着什么?赶快收藏备战金九银十!
2019-04-29
大牛深入讲解!Android面试中常问的MMAP到底是啥东东?再不刷题就晚了!
2019-04-29
太赞了!你会的还只有初级安卓工程师的技术吗?3面直接拿到offer
2019-04-29
腾讯Android开发面试记录,安卓系列学习进阶视频
2019-04-29
阿里P8架构师的Android大厂面试题总结,醍醐灌顶!
2019-04-29
阿里、腾讯大厂Android面试必问知识点系统梳理,满满干货指导
2019-04-29