封魔篇——“我们不一样“

数组:数组是用于储存多个相同类型数据的集合。

指针:指针是一个变量,但是它和普通变量不一样,它存放的是其它变量在内存中的地址。

    
1. 赋值:
       数组:只能一个一个元素的赋值或拷贝
       指针:指针变量可以相互赋值

    
2. 表示范围:
       数组有效范围就是其空间的范围,数组名使用下标引用元素,不能指向别的数组
       指针可以指向任何地址,但是不能随意访问,必须依附在变量有效范围之内

    
3. sizeof:
       数组:
       数组所占存储空间的内存:sizeof(数组名)
       数组的大小(数组元素个数):sizeof(数组名)/sizeof(数据类型)

       指针:
       在 32 位平台下,无论指针的类型是什么,sizeof(指针名)都是 4
       在 64 位平台下,无论指针的类型是什么,sizeof(指针名)都是 8

    
4. 指针数组和数组指针
       针指数组:
       int *qishou[2];//定义一个有两个元素的指针数组,每个元素都是一个指针变量
       int girl1= 167;
       int girl2 = 171;
       qishou[0] = &girl1;
       qishou[1] = &girl2;

    
       数组指针:
       int (*p)[3]; //定义一个指向三个成员的数组的指针
       访问元素的两种方式:
       int A[4][3]={{173, 158, 166},
                  {168, 155, 171},
                  {163, 164, 165},
                  {163, 164, 172}};

       p = &A[0];
       数组法: (*p)[ j ]
       指针法: *((*p)+j)

    
5. 传参

数组传参时,会退化为指针!

(1)退化的意义:C 语言只会以值拷贝的方式传递参数,参数传递时,如果只拷贝整个数 组,效率会大大降低,并且在参数位于栈上,太大的数组拷贝将会导致栈溢出。

(2)因此,C 语言将数组的传参进行了退化。将整个数组拷贝一份传入函数时,将数组名 看做常量指针,传数组首元素的地址。

#include <stdio.h>
#include <stdlib.h> /*------------------ <一维数组传参> -----------------------*/
/*方式一: 形参不指定数组大小 用数组的形式传递参数,不需要指定参数的大小,
因为在一维数组传参时,形参不会真实的创建数组, 传的只是数组首元素的地址。 */void method_1(int arr[], int len) { for(int i=0; i<len; i++){ printf(" arr[%d] = %d\n", i, arr[i]); } }//方式二:指定数组大小
void method_2(int arr[10]) { for(int i=0; i<10; i++){ printf(" arr[%d] = %d\n", i, arr[i]); }
}//方式三: 一维数组传参退化,用指针进行接收,传的是数组首元素的地址
void method_3(int *arr, int len) { for(int i=0; i<len; i++){ printf(" arr[%d] = %d\n", i, arr[i]); }
}int main() { int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; method_1(arr, 10); printf("------华丽的分隔线------\n"); method_2(arr); printf("------华丽的分隔线------\n"); method_3(arr, 10); system("pause"); return 0;
}
#include <stdio.h>
#include <stdlib.h> /*-------------------- <指针数组传参> -----------------------*/
//方式一: 指针数组传参,声明成指针数组,不指定数组大小
void method_4(int *arr[], int len) { for(int i=0; i<len; i++){ printf(" arr[%d] = %d\n", i, *arr[i]); }
}//方式二: 指针数组传参,声明成指针数组,指定数组大小
void method_5(int *arr[10]) { for(int i=0; i<10; i++){ printf(" arr[%d] = %d\n", i, *arr[i]); }
}//方式三: 二维指针传参
//传过去是指针数组的数组名,代表首元素地址,而数组的首元素又是一个指针,
//就表示二级指针,用二级指针接收
void method_6(int **arr, int len) { for(int i=0; i<len; i++){ printf(" arr[%d] = %d\n", i, *(*(arr+i))); }
}int main() { int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int *arr_p[10] = {0}; for(int i=0; i<10; i++){ arr_p[i] = &arr[i]; }method_4(arr_p, 10); printf("------华丽的分隔线------\n"); method_5(arr_p); printf("------华丽的分隔线------\n"); method_6(arr_p, 10); system("pause"); return 0;
}

衣带渐宽终不悔,为“指针”消得人憔悴(三)相关推荐

  1. 《Oracle性能优化与诊断案例精选》——2.3 衣带渐宽终不悔

    本节书摘来自异步社区出版社<Oracle性能优化与诊断案例精选>一书中的第2章,第2.3节,作者:盖国强 , 李轶楠 ,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  2. c语言:(指针)实现输入三个整数从小到大排序

    c语言:(指针)实现输入三个整数从小到大排序 #include<stdio.h> #include<stdlib.h> #include<string.h> #in ...

  3. 本大三狗处博——为工作消得人憔悴

    大家好,来csdn这么多天了,本嘤嘤怪终于决定写一遍博客,就当做是记录吧. 我今年大三,学校要求马上就要实习了,我学过C,JAVA,数据库,MATLAB,HTML,CSS,JS. 但是学到现在,我发现 ...

  4. 深入理解 C 指针阅读笔记 -- 第三章

    Chapter3.h #ifndef __CHAPTER_3_ #define __CHAPTER_3_/*<深入理解C指针>学习笔记 -- 第三章*//*它们都保存在栈中的什么位置?*/ ...

  5. c语言键盘回调函数键盘的码,深入浅出剖析C语言函数指针与回调函数(三)

    前面两篇文章: http://blog.csdn.net/morixinguan/article/details/65494239 http://blog.csdn.net/morixinguan/a ...

  6. 每日程序C语言34-利用指针将输入的三个数排序

    题目: 输入三个数a,b,c,按大小顺序输出,利用指针方法 程序分析 int *p; 表示这是int型的指针 int a; *p=&a;//将变量a的地址赋值给指针p &a表示取int ...

  7. C专家编程--指针和数组(三) 值传递 指针传递 引用传递

    可以先看下这两篇文章 http://blog.csdn.net/yusiguyuan/article/details/12357381 http://blog.csdn.net/yusiguyuan/ ...

  8. 1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

     1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int ...

  9. Kernel那些事儿之内存管理(5) --- 衣带渐宽终不悔(上)

    Kernel中负责分配一个连续内存页块的子系统一般被称为zoned page frame allocator.前面讲了函数 buffered_rmqueue() 是如何从指定zone的buddy sy ...

  10. sdh管理单元指针_「干货三」SDH技术重点知识分布(附小技巧)

    每天给大家带来实用干货, 助大家轻松备考! 今天给大家带来的是SDH技术知识分布. SDH技术历年考点分布情况 从历年的考试情况和考试大纲的要求来看,本章主要要求考生重点关注:SDH的帧结构及其各部分 ...

最新文章

  1. rs232串口驱动_LED驱动电路设计
  2. linux redis php,Linux下编译redis和phpredis的方法
  3. AceTeamwork 软件成就继续蝉联国内最优秀的项目工时(timesheet)及费用报销(expense)软件...
  4. python根据表格数据生成折线图_Python交互图表可视化Bokeh:4. 折线图| 面积图
  5. linux-jmeter负载机配置记录
  6. 你真的会用ABAP, Java和JavaScript里的constructor么? 1
  7. 漫游飞行_涨知识了,手机的飞行模式还能这么用?
  8. python---用python实现冒泡排序
  9. WAV音频文件的分析
  10. 第一章 Python pyodbc连接access数据库的使用方法
  11. 《Adobe Illustrator CS6中文版经典教程(彩色版)》—第0课0.4节应用颜色
  12. app如何助推用户从pc端转向手机端
  13. 10-7文字检测部分初探
  14. 探讨内容付费的本质和趋势
  15. Basic4IOS (B4I) New Version Crack
  16. Proteus 8 Source Code 字体设置问题 光标于选中的字不对应
  17. 核磁共振成像读片指南(二)
  18. 2021-2027全球与中国工业锂电池市场现状及未来发展趋势
  19. 为什么VPS会被云服务器取代?
  20. [清华集训2014]奇数国

热门文章

  1. SQOOP学习笔记-报错怎么办?打就完了!
  2. Linux工作目录切换命令
  3. Discuz模版制作流程
  4. 2016十月新番简介
  5. 小学生c语言入门教程,小学生都看得懂的C语言入门(5): 指针
  6. python使用turtle库绘制奥运五环
  7. opengl——贴图
  8. rabbitmq启动报错,TCP connection succeeded but Erlang distribution failed
  9. 行星轨迹制作_用3ds max制作三维行星运动动画
  10. 山西千年古堡张壁古堡:品“地道”中国年