简单分析C语言中指针数组与数组指针的区别

 更新时间:2015年11月19日 15:34:15   作者:romi  
这篇文章主要介绍了C语言中指针数组与数组指针的区别,是C语言入门学习中的基础知识,需要的朋友可以参考下

首先来分别看一下,指针数组的一个小例子:

#include <stdio.h> 
#include <string.h> 
 
int lookup_keyword(const char*key, const char* table[], const int size) 
{ 
  int ret = -1; 
 
  int i = 0; 
 
  for(i=0; i<size; i++) 
  { 
    if (strcmp(key, table[i]) == 0) 
    { 
      ret = i; 
      break; 
    } 
  } 
  return ret; 
} 
 
#define DIM(array) (sizeof(array)/sizeof(*array)) 
 
int main() 
{ 
  const char* keyword[] = { 
      "do", 
      "for", 
      "if", 
      "register", 
      "switch", 
      "while", 
      "case", 
      "static", 
  }; 
 
  printf("%d\n", lookup_keyword("static", keyword, DIM(keyword))); 
 
  return 0; 
} 

数组指针:

#include <stdio.h> 
 
int main() 
{ 
  int i; 
  int* pI = &i; //普通类型 
 
  typedef int(AINT5)[5]; 
  AINT5* p1; 
  int array[5]; 
  p1 = &array; //数组指针1 
 
  int (*p2)[5] = &array; //数组指针2(不建议这样写) 
 
  int (*p3)[4] = &array; // X 数组指针3(不建议这样写) 
 
  return 0; 
} 

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

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

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

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

int* a[4]     指针数组    

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

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

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

                 表示:指向数组a的指针

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

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

typedef int* pInt;
pInt a[4];

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

代码演示如下:

#include <iostream>
 
using namespace std;
 
int main()
{
int c[4]={1,2,3,4};
int *a[4]; //指针数组
int (*b)[4]; //数组指针
b=&c;
//将数组c中元素赋给数组a
for(int i=0;i<4;i++)
{
a[i]=&c[i];
}
//输出看下结果
cout<<*a[1]<<endl; //输出2就对
cout<<(*b)[2]<<endl; //输出3就对
return 0;
}

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

相关文章

  • 利用C++开发一个protobuf动态解析工具

    利用C++开发一个protobuf动态解析工具

    数据库中存储的protobuf序列化的内容,有时候查问题想直接解析查看内容。很多编码在网上很容易找到编解码工具,但protobuf没有找到编解码工具,可能这样的需求比较少吧,那就自己用C++实现一个,感兴趣的可以了解一下
    2023-01-01
  • C语言深入讲解动态内存分配函数的使用

    C语言深入讲解动态内存分配函数的使用

    这篇文章主要介绍了C语言动态内存分配,C语言内存管理相关的函数主要有realloc、calloc、malloc、free、柔性数组等,下面这篇文章带大家了解一下
    2022-05-05
  • C语言中递归的实际应用与经典问题

    C语言中递归的实际应用与经典问题

    函数以及函数的递归调用是学习C语言必须要掌握的内容,且递归作为经典的算法思想被广泛应用于程序设计中,下面这篇文章主要给大家介绍了关于C语言中递归的实际应用与经典问题的相关资料,需要的朋友可以参考下
    2021-09-09
  • C语言实现简单扫雷源码

    C语言实现简单扫雷源码

    这篇文章主要为大家详细介绍了C语言实现简单扫雷源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • 使用C语言实现珠玑妙算Mastermind小游戏

    使用C语言实现珠玑妙算Mastermind小游戏

    这篇文章主要介绍了使用C语言实现珠玑妙算Mastermind小游戏,这是一款益智类多人游戏游戏,非常有趣,需要的朋友可以参考下
    2023-03-03
  • C++中sting类的简单实现方法

    C++中sting类的简单实现方法

    这篇文章主要介绍了C++中sting类的简单实现方法的相关资料,需要的朋友可以参考下
    2016-08-08
  • C语言详尽图解函数栈帧的创建和销毁实现

    C语言详尽图解函数栈帧的创建和销毁实现

    我们知道c语言中函数都是被调用的,main函数里面能调用其他函数,其实main函数也是被别的函数调用的,下面通过本文给大家分享c语言函数栈帧的创建和销毁过程,一起看看吧
    2022-05-05
  • C++11/14 线程的创建与分离的实现

    C++11/14 线程的创建与分离的实现

    这篇文章主要介绍了C++11/14 线程的创建与分离的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • C++利用函数动态创建二维数组

    C++利用函数动态创建二维数组

    这篇文章主要为大家详细介绍了C++利用函数动态创建二维数组,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • C++私有继承与EBO深入分析讲解

    C++私有继承与EBO深入分析讲解

    这篇文章主要介绍了C++私有继承,在私有继承当中,基类的公有成员和保护成员都会成为派生类的私有成员。这意味着基类的方法都会被private关键字描述,我们可以在派生类中使用它,但类对象无法直接调用,下面来看看详细内容吧
    2022-08-08

最新评论