一.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语言指针笔记的更多相关文章

  1. C语言指针笔记01

    int num = 90; 定义一个整型变量num int* ptr = &num; 定义一个整型指针变量ptr,指针变量ptr的类型取决于他所需要指向的变量,如这里,ptr要指向int类型变 ...

  2. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  3. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  4. 2-Linux C语言指针与内存-学习笔记

    Linux C语言指针与内存 前面我们对于: c语言的基本用法 makeFile文件的使用 main函数的详解 标准输入输出流以及错误流管道 工具与原理 指针与内存都是c语言中的要点与难点 指针 数组 ...

  5. go学习笔记-语言指针

    语言指针 定义及使用 变量是一种使用方便的占位符,用于引用计算机内存地址.取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址. 一个指针变量指向了一个值的内存地址.类似于变量和常量, ...

  6. C语言中的指针笔记

    C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...

  7. c语言的笔记

    下面把我这半年来记的一些C语言的笔记贴出来. 1  C语言中函数参数传递是按照“值传递”进行的,即单向传递. 2  函数原型:函数类型 函数名(参数类型,参数类型……),可以不必加参数名,因为操作系统 ...

  8. C语言盲点笔记1

    寥寥数笔,记录我的C语言盲点笔记,仅仅为以前经历过,亦有误,可交流. 1.int* a和int *a有差别吗? 没有不论什么差别,都表示a是int指针 建议这么写int *a;这样明显一点 理由例如以 ...

  9. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

随机推荐

  1. Ubuntu 安装软件方法

    Ubuntu软件安装有几种方式,常用的是deb包的安装方式,deb是debian系列的Linux包管理方式,Ubuntu软件安装属于debian的派生,也默认支持这种软件安装方式,当下载到一个deb格 ...

  2. Pandas的排序和排名(Series, DataFrame) + groupby

    根据条件对数据集排序(sorting)也是一种重要的内置运算.要对行或列索引进行排序(按字典顺序), 可使用sort_index 方法, 它将返回一个已排序的新对象: 而DataFrame, 则可以根 ...

  3. 解决IE6下浮层遮盖select刺穿的问题

    图一未解决刺穿问题: 图二已解决                       解决方法使用iframe间接挡住层,具体方法见源码 源码一(未解决刺穿):   <html xmlns=" ...

  4. 用OpenGL实现粒子的随机运动

    一.目的: 掌握OpenGL中粒子的绘制.随机数的使用 二.代码: Github地址 #include "stdafx.h" #include <GL/glut.h> ...

  5. objective-C 的内存管理之-自动释放池(autorelease pool)

    如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候 ...

  6. Solr系列一:Solr(Solr介绍、Solr应用架构、Solr安装使用)

    一.前言 前面已经学习了Lucene的分词.索引详解.搜索详解的知识,已经知道开发一个搜索引擎的流程了.现在就会有这样的一个问题:如果其他的系统也需要使用开发的搜索引擎怎么办呢?这个时候就需要把开发的 ...

  7. git 出错 bad index file sha1 signature

    error: bad index file sha1 signature fatal: index file corrupt 解决方法:使用git命令执行: $ rm -f .git/index $ ...

  8. objelement = event.target || event.srcElement;

    objelement = event.target || event.srcElement; function updateProductVideo(e){ e = window.event || a ...

  9. 038改变状态栏的颜色(扩展知识:关于iOS不同版本的消息通知知识)

    效果如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController @e ...

  10. Android学习之——实现圆角Button

    在drawable文件夹下新建btn_shape.xml文件: <?xml version="1.0" encoding="utf-8"?> < ...