c语言指针笔记
一.int a[20]
1. 数组名代表数组首元素的地址,不代表数组的地址
2. 对数组名取地址代表整个数组的地址.
a和&a代表的数据类型不一样 a代表数组首元素的地址 &a数组类型 int[20]类型
数组的类型由元素的类型和数组大小共同决定 如:int array[5] 的类型为int[5]
数组类型:
typedef int(MYINT5)[5]; MYINT5为长度为5的数组类型
typedef float[MYFLOAT10][10] MYFLOAT10 为长度为10的浮点数组类型
数组定义:
MYINT5 iArray;
MYFLOAT10 fArray;
二. 数组指针
1. 使用数组类型来定义数组指针:
typedef int(MYINT5)[5]; // MYINT5为长度为5的数组类型
MYINT5 * pArray;//定义一个指向数组类型的指针变量
int e[5]={1,2,3,4,5};
pArray = &e;//对数组指针赋值,需要对数组名取地址
2. 直接定义一个数组指针
int (*p)[5] //定义一个指向5个整形类型的数组指针
int a[5] = {0};
p = &a;
//用数组指针去遍历数组
for(int i = 0; i<4;i++)
{
(*pArray)[i] = i;
}
三. 二维数组解析
int a[5][6];
数组名代表数组首元素的地址 所以a是一个数组指针,它的步长为6, 相当于 int(*p)[6]
四. 函数指针作为函数参数的三种模型
模型一:二维数组作为函数参数
因为数组在传递给函数作为函数参数的时候会出现退化的情况,会退化为指针,
所以二维数组在传参的过程中也会变成指针,例如:把二维数组 char a[5][100]要作为
参数传递给一个函数,那么函数的声明可以用下列方式声明:
void f(char a[5][100]);
void f(char a[][100]);//因为数组会退化成指针,所以第一个方括号中的长度没有也可以
void f(char (*a)[100]);//在第二个的基础上,编译器会把数组转化为指针,而这个指针应该能正确反映出a+1代表的步长,所以应该参数声明为数组指针,而不能是二级指针char **p;因为二级指针进行*操作,例如(*p)+1那么步长是4,因为
进行*p操作,(*p)是 char *类型,char * 类型的长度是4,而数组的步长在这里是100,所以会出现错误
模型二:指针数组作为函数参数
指针数组其实是一个数组,数组的成员指针类型: 例如: char *p[100];
因为是数组,所以在传递给函数参数的时候,会退化成指针,所以函数可以这样声明:
void f(char * p[100]);
void f(char *p[]);//数组会退化成指针,所以有没有数组长度都无所谓
void f(char **p);在第二步的基础上,继续退化成指针类型,就变成了二级指针.
模型三:程序员手动使用malloc函数分配内存
首先分配一个数组,数组的成员是指针类型,每个成员分别指向一个一维数组,例如:
char **myarray = (char **)malloc(10*sizeof(char*)); //int array[10]
if (myarray == NULL)
{
return;
}
for (i=0; i<10; i++)
{
myarray[i] = (char *)malloc(100*sizeof(char)); //char buf[100];
if (myarray[i] == NULL)
{
printf("ddddde\n");
return;
}
sprintf(myarray[i],"%d%d%d ", i, i, i);
}
这种模型和模型二基本一样,只不过是程序员手动分配的内存空间,所以在使用完后要及时释放指针,防止memory leak;
综上所述:
二维数组作为函数参数应该使用数组指针来声明函数参数
指针数组作为函数参数应该使用二级指针来声明函数参数
c语言指针笔记的更多相关文章
- C语言指针笔记01
int num = 90; 定义一个整型变量num int* ptr = # 定义一个整型指针变量ptr,指针变量ptr的类型取决于他所需要指向的变量,如这里,ptr要指向int类型变 ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- 2-Linux C语言指针与内存-学习笔记
Linux C语言指针与内存 前面我们对于: c语言的基本用法 makeFile文件的使用 main函数的详解 标准输入输出流以及错误流管道 工具与原理 指针与内存都是c语言中的要点与难点 指针 数组 ...
- go学习笔记-语言指针
语言指针 定义及使用 变量是一种使用方便的占位符,用于引用计算机内存地址.取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址. 一个指针变量指向了一个值的内存地址.类似于变量和常量, ...
- C语言中的指针笔记
C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...
- c语言的笔记
下面把我这半年来记的一些C语言的笔记贴出来. 1 C语言中函数参数传递是按照“值传递”进行的,即单向传递. 2 函数原型:函数类型 函数名(参数类型,参数类型……),可以不必加参数名,因为操作系统 ...
- C语言盲点笔记1
寥寥数笔,记录我的C语言盲点笔记,仅仅为以前经历过,亦有误,可交流. 1.int* a和int *a有差别吗? 没有不论什么差别,都表示a是int指针 建议这么写int *a;这样明显一点 理由例如以 ...
- GO语言学习笔记(一)
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
随机推荐
- USB2.0学习笔记连载(十八):keil实现寄存器的配置及相关函数讲解(二)
其实之前也有提及过,Cypress公司提供的官方文件和应用手册真的可以解决很多问题.做的也很人性化,操作也及其简单,几乎只要在 TD_int()里面配置一些常用的参数即可,其他都可以不用操作. 作为一 ...
- SpannableString属性详解
1.BackgroundColorSpan 背景色 2.ClickableSpan 文本可点击,有点击事件 3.ForegroundColorSpan 文本颜色(前景色) 4.Ma ...
- qualcomm permission denied for tty device
在app中访问串口,提示没有读写权限.本文记录解决方法. 调试 查看设备节点权限 shell@msm8909:/ # ll /dev/ttyHSL* crw------- root root 246, ...
- Spring JMS 官方文档学习
最后部分的XML懒得写了,因为个人更倾向于JavaConfig形式. 为知笔记版本见这里,带格式~ 做了一个小demo,放到码云上了,有兴趣的点我. 说明:需要先了解下JMS的基础知识. 1.介绍 S ...
- html5学习摘要
1.HTML5简介 什么是 HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML5 仍处于完善之中.然而,大部分现代浏览器已经具备了某些 HTML5 支 ...
- Spring JDBC ResultSetExtractor接口示例
org.springframework.jdbc.core.ResultSetExtractor接口是JdbcTemplate的查询方法使用的回调接口.此接口的实现执行从ResultSet提取结果的实 ...
- JAVA编程环境JDK与JRE运行环境与API核心ClassMap
JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境.JDK是整个Java的核心1.Java运行环境( ...
- Unity------Unity 脚本基类 MonoBehaviour 与 GameObject 的关系
Unity 脚本基类 MonoBehaviour 与 GameObject 的关系 标签: unity脚本 2017-03-27 12:55 395人阅读 评论(0) 收藏 举报 分类: Unity ...
- 嵌入式开发之zynq驱动—— zynq ps pl ddr 内存地址空间映射
http://www.wiki.xilinx.com/Zynq-7000+AP+SoC+-+32+Bit+DDR+Access+with+ECC+Tech+Tip http://patchwork.o ...
- 核心动画——Core Animation
一. CALayer (一). CALayer简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比方一个button.一个文本标签.一个文本输入框.一个图标等等.这些都是UIView ...