二、关键词 之 指针数组和数组指针的区别

这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4]     指针数组

表示:数组a中的元素都为int型指针

元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针

表示:指向数组a的指针

元素表示:(*a)[i]

注意:在实际应用中,对于指针数组,我们经常这样使用:

1 typedef int* pInt;
2 pInt a[4];

这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。

代码演示如下:

 1 #include <iostream>
 2 using namespace std;
 3
 4 int main()
 5 {
 6     int c[4] = {1,2,3,4};
 7     int *a[4];//指针数组
 8     int (*b)[4];//数组指针
 9     b = &c;
10     //将数组c中元素赋给数组a
11     for(int i = 0; i < 4; i++)
12     {
13         a[i] = &c[i];
14     }
15     //输出看下结果
16     cout << *a[1] << endl; //输出2就对
17     cout << (*b)[2] << endl; //输出3就对
18     return 0;
19 }

注意:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(*b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写*a[i]=c[i],这同样会出问题。总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧。

类似的还有指针函数和函数指针,遇到了再说吧。

时间: 2024-12-14 08:18:13

二、关键词 之 指针数组和数组指针的区别的相关文章

C语言笔记(二维数组与数值指针)

一.关于二维数组和二维数组区别 (1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的.所以从内存的角度来分析,一维数组和二维数组其实没有本质区别. (2) 二维数组可以使用一维数组来代替.但是在实际的应用中,有时候使用二维数组会更加直观,方便程序的编程. (3)两者在内存使用效率上是一模一样的. 二.二维数组的第一维和第二维概念 (1)例如 int a[2][5]中,前面的2表示第一维:后面的5表示第二维 (2) 二维数组的第一维表示最外部的那一层,第一维本身也是一个数组,

编程题:指向二维数组元素的指针变量。功能:已知二维数组a[2][3],输入输出全部元素。

#include<stdio.h> void main() { int a[2][3],i,j; int *p; /*用坐标法输入二维数组元素*/ for(i=0;i<2;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); /*用指针法输出二维数组元素*/ p=a[0];         /*等价于p&a[0][0];*/ for(;p<a[0]+6;p++)   printf("%4d&quo

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

二维数组和二级指针作为参数传给参数的方式

  一.如果要将二维数组传给一个函数,有几种传参方式?     1).直接将二维数组传给函数.     eg:         void test(int arr[3][4]); 2).以数组指针的方式传入.     eg:         void test(int (*arr)[4]); 第一种方式很容易理解.第二方式我们来分析分析.首先将二维数组看作是一个一维数组,有三个元素,arr[0],arr[1],arr[2].每个元素中有四个元素.例如,(arr[0])[0],(arr[0])[1

关于理解指针数组,数组指针,数组名,二维数组的一些技巧。

/*************关于数组名***************/ int a[3] = {1, 2, 3} 1.数组名代表数组第一个元素的地址,注意,不是数组地址(虽然值相等),是数组第一个元素地址,a 等同于 &a[0]; a+1是第二个元素的地址.比第一个元素地址a(或者&a[0])超出了一个整型指针的大小,在这里是4个字节(byte) cout << a << endl;会输出数组第一个元素地址. 2.取址符号&. &a是数组的地址,注意

二维数组和指向指针的指针

引用地址: http://www.cnblogs.com/stoneJin/archive/2011/09/21/2184211.html 一道面试题引发的问题,首先要知道[]的优先级高于*,题目: char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么? 直接用程序说明: #include<stdio.h> void main(){ char **p,a[6][8]; p = a; printf("\n");} 编译,然后就会发现通不过,报错:错

指针与一维数组和二维数组以及字符串指针数组的学习笔记

废话不多少,直接上代码,关键的东西已经注释了,看注释信息理解即可. 说明:本程序讨论了一维数组和指针的关系,谈论了二维数组和指针之间的关系,讨论了字符串数组指针数组和指针之间的关系,代码中以给出定义的方法和简单的使用,但是有些使用方法并没有列出,如果需要, 请自行加入printf调试即可. 转贴请注明出处,欢迎和我讨论,谢谢. ----------cofin_add #include <stdio.h> void fun(int m, char *((*p)[m])){ int i = 0;

二维数组和二级指针关系浅析

昨天写了关于一级指针的见解,即二级数组的用法和二级指针差不多,关于数组指针和指针数组这两个是不同的概念,这一点我们一定要清楚: 数组指针我们可以理解为指向数组的指针,就是一个指针: 指针数组则可以理解为数组里存的是指针,即每个储存空间上储存的是指针变量:这里储存了多个指针 一个数组可以这样定义 char a[3];分配了3个字节的内存 二维数组可以这样定义 char b[3][3];分配了3*3 即9个字节的内存 我们知道一维数组和一级指针的用法差不多,那么二级指针有和二级指针有什么关系呢? {

二维数组和二级指针(真的没什么关系)

刚开始学c语言的时候,总是会认为,一级指针可以用来访问一维数组,那么二维数组就要用二级指针来访问啦.... 实际上二级指针和二维数组真的没什么关系,而且,切记千万不要用二级指针访问二维数组..... 下面是几个有关的小程序,加深印象........ 实验环境:主机CPU酷睿i5,vs2012 程序1: int _tmain(int argc, _TCHAR* argv[]) { int **p= NULL; int a[2][3] = {1,2,3,4}; p = a; return 0; }