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 ...
随机推荐
- struts2系列(二):struts2参数传递错误、struts2的输入错误验证
一.struts2参数传递错误 1. 基本数据类型的传递最好使用包装类,原因是struts 2.1之后使用基本数据类型如果参数为空会报错2. 日期参数的传递最好定义一个区域的属性(定义locale), ...
- (转)FFmpeg源代码简单分析:avformat_open_input()
目录(?)[+] ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结 ...
- java Object类源代码详解 及native (转自 http://blog.csdn.net/sjw890821sjw/article/details/8058843)
package java.lang; public class Object { /* 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用.*/ private static na ...
- 笔记关闭fn功能
使用笔记本在vs开发中调试需要加fn+10进行调试,一点都不方便,使用fn+esc(fnLock)这个功能就可以关闭fn功能
- 联想服务器X3650 M2 配置 RAID5 + 热备盘
实验环境: 1. 服务器型号联想 System X3650 M2 2. 六块300G SAS硬盘 实验目的: 配置RAID 5 ,搭建重要文件备份服务器. 标注:本教程六块硬盘,其中五块硬盘做R ...
- 第一個shell腳本
#!/bin/bash echo "Hello World !" 運行
- ubuntu16.04卸载tensorflow0.11版本,安装tensorflow1.1.0版本
卸载旧版本: pip uninstall tensorflow 安装新版本: sudo pip install --upgrade https://storage.googleapis.com/ten ...
- Hadoop学习笔记——WordCount
1.在IDEA下新建工程,选择from Mevan GroupId:WordCount ArtifactId:com.hadoop.1st Project name:WordCount 2.pom.x ...
- Throwable vs Exception
Throwable中的Error是不需要程序处理的. Exception是需要处理的.
- Linux 系统磁盘满处理方法
1.使用find命令,找出占用空间较大的文件 find / -type f -size +5G —找到大于5G的文件,有work权限的情况下可以使用 find . -type f -size +1 ...