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 ...
随机推荐
- 关于使用QTcpSocket的一些总结
QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险.必须 ...
- 【转】Android配置文件权限一览表
转自:http://blog.csdn.net/kbest/article/details/7495154访问登记属性 android.permission.ACCESS_CHECKIN_PROPER ...
- [转]Android精品开源项目整理
前言: 无论你是android的初学者,还有是android开发多年的高手,可能都会有很多想法和经验希望与人分享交流,渴望能够接触到更多的实战项目,正所谓所谓与高手论道才能互补所长,与英雄 ...
- php生成二维码的几种方式[转]
二维码是二维条形码的一种,可以将网址.文字.照片等信息通过相应的编码算法编译成为一个方块形条码图案,手机用户可以通过摄像头和解码软件将相关信息重新解码并查看内容.PHP可以使用php QR Cod ...
- WebService系列一:WebService简介
原文链接:http://www.cnblogs.com/xdp-gacl/p/4259109.html 一.WebService是什么 WebService是一种跨编程语言和跨操作系统平台的远程调用技 ...
- MySQL谨慎使用"replace into"
From: http://blog.xupeng.me/2013/10/11/mysql-replace-into-trap/ MySQL 对 SQL 有很多扩展,有些用起来很方便,但有一些被误用之后 ...
- linux中iptables的用法
iptables基本操作笔记 一.基本操作 #启动防火墙 service iptables start #停止防火墙 service iptables stop #重启防火墙 service ipta ...
- nginx搭建(centos7)
1.安装前准备: 系统: CentOS 7.5 x64 下载包:wget yum -y install wget 安装: 2.安装一下这些依赖条件: yum install gcc pcre pcre ...
- git 出错 bad index file sha1 signature
error: bad index file sha1 signature fatal: index file corrupt 解决方法:使用git命令执行: $ rm -f .git/index $ ...
- android 自己定义TextView"会发脾气的TextView"
转载请注明出处王亟亟的大牛路 Git上看到的一个自己定义控件就搞来研究研究.蛮可爱的. 项目结构: 执行效果:非常Q谈.谈的图片什么都 都能够换哦 自己定义View: public class Jel ...