深入理解数组指针与指针数组的区别
数组指针与指针数组的区别在于:数组指针p是一个指针,而指针数组p是一个存放N个指针变量的数组。
一、数组指针
int (*p)[n]
重点:()优先级高([]、()的优先级是一样的,但它们的方向是从左至右的,所以先运行括号里的*p),首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度(n*sizeof(int))。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p = a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //<=>a[1]<=>p[1]
同时用来指向二维数组时,其引用和用数组名引用都是一样的即a<=>p。比如要表示数组中i行j列一个元素a[i][j]:
p[i][j]<=>a[i][j] <=>*(p[i]+j)<=>*(a[i]+j) <=> *(*(p+i)+j)<=>*(*(a+i)+j) <=> (*(p+i))[j]<=>(*(a+i))[j]
二、指针数组
int *p[n]
重点:[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素:即它就是一个存放了n个指针的数组。
这样赋值也是错误的:p=a;因为p是个右值,p的值只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样*p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
for(i = 0; i < 3; i++)
p[i] = a[i];
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],默认情况下这三个指针变量都指向NULL的,所以要分别赋值。
相关推荐
-
数组指针、指针数组以及二位数组的深入解析
int *p[3]与int (*p)[3]的区别*p[3]这个是一个指针数组,它所代表的意思是数组中的每一个元素都是一个指针变量,而(*p)[3],p是一个指针变量,表示指向一个含有3个整型元素的一维数组. 复制代码 代码如下: int i,j; int a[2][3]={3,4,5,6,7,8}; // int *p[3] ; //表示一个数组,数组中的元素是指针类型,一共有三个元素 int (*q)[3]; //是一个指针,指向一个含有三个int型的数组(q+1)会跳三个
-
C语言数组指针的小例子
1.功能:输入6个学生的5门课程成绩,计算出每个学生的平均分和每门课程的平均分.2.C语言实现代码:(其实就是用二维数组来实现的,二维数组的引用传递使用数组指针来完成) 复制代码 代码如下: #include <stdio.h>#define STUDENT 5#define SCORE 6void input_array(float (*score)[STUDENT]);void avg_score(float (*score)[STUDENT]);void avg_course(float
-
深入解析C++中的指针数组与指向指针的指针
指针数组定义:如果一个 数组,其元素均为指针型数据,该数组为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址. 形式:一维指针数组的定义形式为:int[类型名] *p[数组名] [4][数组长度];由于[ ]比*优先级高,因此p先与[4]结合,形成p[4]的数组的形式.然后与p前面的" * "结合," * "表示此数组是指针类型的,每个数组元素都相当于一个指针变量,都可以指向整形变量. 注意:不能写成int (*p)[4]的形式,这是指的
-
举例理解C语言二维数组的指针指向问题
之前对数组的概念一直没有理解透彻,只觉得数组名就是个常量指针而已,用法和基本的指针差不多.所以当我尝试用二级指针去访问二维数组时,就经常会出错.下面就是刚开始写的一个错误的程序: #include <stdio.h> int main() { int iArray[2][3] = {{1,2,3},{4,5,6}}; int **pArray = NULL; pArray = iArray; printf("array[0][0] = %d\n", pArray[0][0]
-
直观理解C语言中指向一位数组与二维数组的指针
一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5]; a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值. 而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我
-
深入理解数组指针与指针数组的区别
数组指针与指针数组的区别在于:数组指针p是一个指针,而指针数组p是一个存放N个指针变量的数组. 一.数组指针int (*p)[n]重点:()优先级高([].()的优先级是一样的,但它们的方向是从左至右的,所以先运行括号里的*p),首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数据的长度(n*sizeof(int)).如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (
-
汇编中的数组分配和指针的实现代码
数组简介 如果各位猿友是一路跟着LZ看到这里的,那么数组的定义就非常简单了,它就是一个相同数据类型的数据集合.数组存储在一系列逻辑上连续的内存块当中,之所以说是逻辑上连续,是因为整个内存或者说存储器本身就是逻辑上连续的一个大内存数组.如果我们用Java语言的类型来表示我们的存储器的话,可以看做是byte[] memory这样的类型. 数组的定义非常简单,它遵循以下这样简单的规则. T N[L]; 这当中T表示数据类型,N是变量名称,L是数组长度.这样的声明会做两件事,首先是在内存当中开辟一个长为
-
详解C++数组和数组名问题(指针、解引用)
目录 一.指针 1.1 指针变量和普通变量的区别 1.2 为什么需要指针 1.3 指针使用三部曲 二.整形.浮点型数组 2.1 数组名其实是特殊的指针 2.2 理解复杂的数组的声明 2.3 数组名a.数组名取地址&a.数组首元素地址&a[0].指向数组首元素的指针*p 2.4 对数组名以及取值符&的理解 三.字符数组数组名 一.指针 1.1 指针变量和普通变量的区别 指针:指针的实质就是个变量,它跟普通变量没有任何本质区别.指针完整的应该叫指针变量,简称为指针. 是指向的意思.指针
-
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
each()定义和用法 each() 函数生成一个由数组当前内部指针所指向的元素的键名和键值组成的数组,并把内部指针向前移动. 返回的数组中包括的四个元素:键名为 0,1,key 和 value.单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据. 如果内部指针越过了数组范围,本函数将返回 FALSE. 语法 each(array)参数 描述 array 必需.规定要使用的数组. 例子 1 复制代码 代码如下: <?php $people = array("Pete
-
C语言安全之数组长度与指针实例解析
1.C语言编码需要保证变长数组的长度参数位于合法范围之内 例如以下代码: void func(size_t s) { int vla[s]; /*...*/ } /*...*/ func(size); /*...*/ 解决方案如下: enum {MAX_ARRAY = 1024}; void func(size_t s) { if(s < MAX_ARRAY && s != 0) { int vla[s]; /*...*/ } else { //错误处理 } } /*...*/ fu
-
探讨C++中数组名与指针的用法比较分析
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.但是数组名有些地方又不同于指针.这里将数组名与指针用法的不同做一下总结(有些资料来自互联网),不妥之处,还望指正!(本文程序在WIN32平台下编译):1.数组名和指向那个数组的指针,地址相同,但大小不同用例子来说明: 复制代码 代码如下: #include "stdafx.h"#include <iostream>using namespace std;int _tmain(int
-
PHP中使用数组指针函数操作数组示例
数组的内部指针是数组内部的组织机制,指向一个数组中的某个元素.默认是指向数组中第一个元素通过移动或改变指针的位置,可以访问数组中的任意元素.对于数组指针的控制PHP提供了以下几个内建函数可以利用. ★current():取得目前指针位置的内容资料. ★key():读取目前指针所指向资料的索引值(键值). ★next():将数组中的内部指针移动到下一个单元. ★prev():将数组的内部指针倒回一位. ★end():将数组的内部指针指向最后一个元素. ★reset():将目前指针无条件移至第一个索
随机推荐
- spring mvc中的@ModelAttribute注解示例介绍
- iOS开发中音频视频播放的简单实现方法
- Jquery为单选框checkbox绑定单击click事件
- 浅谈es6语法 (Proxy和Reflect的对比)
- VBS教程:函数-DateSerial 函数
- Spring依赖注入的两种方式(根据实例详解)
- IOS多线程实现多图片下载(二)
- 讲解Oracle数据库中结束死锁进程的一般方法
- python算法学习之桶排序算法实例(分块排序)
- ASP.NET GridView中文本内容无法换行(自动换行/正常换行)
- php遍历目录与文件夹的多种方法详解
- python 文件操作api(文件操作函数)
- mysql删除重复记录语句的方法
- JavaScript定义变量和变量优先级问题探讨
- Zen Coding 快速编写HTML/CSS代码的实现
- jquery easyUI中ajax异步校验用户名
- Android自定义View实现竖直跑马灯效果案例解析
- Linux基础知识99问(一)
- 《C++ primer plus》读书笔记(三)
- 解析C#中的装箱与拆箱的详解