参考出处:

http://www.cnblogs.com/mq0036/p/3382732.html

http://www.cnblogs.com/hongcha717/archive/2010/10/24/1859780.html

出处中判断哪个是数组指针和指针数组?

A int*p1[10] B int(*p2)[10]

首先看看他们的类型,在 VS C++中使用sizeof运算符。

printf("%d\n",sizeof(p1));  //结果 40  可以看出是一个数组,每一个元素是一个指针,共有10个指针,所以是指针数组,重点在数组上
printf("%d\n",sizeof(p2)); // 结果 4   可以看出是一个指针,指向的是一个数组。

出处中提出了怎样判断的观点:通过优先符判断,对于 int*p[10]    []优先符高,说明是一个数组,每个元素是 int* 类型的指针;对于Int(*p)[10] 优先符()最高,说明是一个指针,指向的是一个整型的一维数组。

然后我们看看如何使用它们获得2维数组的元素值:

int a[2][10] = {{1,1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2,2}};

p1 = a?

p2 = a?

大家都知道 a是一个指向指针的指针常量,a代表整个二维数组的首地址的地址常量,a等价于&a[0] ,是第一个元素的地址,所以指针p2赋值&a[0]是正确的。因为类型相当: 前一种写法不对,后一种对。

那么p1如何赋值呢? 因为p1是指针数组,正确写法是 p1 = a[0]  p1=a[1] ...

完整代码如下:

printf("------");
int *p1[10];
printf("%d\n",sizeof(p1));
int (*p2)[10];
printf("%d\n",sizeof(p2));

int a[2][10] = {{1,1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2,2}};

printf("---指针数组的使用---\n");
for (int i=0;i<2;i++)
{
p1[i] = a[i];
for (int j=0;j<10;j++)
{
printf("%d ",p1[i][j]);
}

printf("指针数组每一行的首地址:p1[i] =  %d  a[i] = %d",p1[i],&a[i]);//1 1 1 1 1 1 1 1 1 1 指针数组每一行的首地址:p1[i] = 13041008 a[i] = 13041008   2 2 2 2 2 2 2 2 2 2 指针数组每一行的首地址:p1[i] = 13041048 a[i] = 13041048

printf("\n");
}

printf("---数组指针的使用---\n");
p2 = a; //写法最简单
for (int i = 0;i<2;i++)
{

for (int j=0;j<10;j++)
{
printf("%d ",p2[0][j]);
}

printf("指针数组每一行的首地址:p2[i] =  %d  a[i] = %d",p2,&a[i]); //结果和上面对应的一样,这也是这两者的区别
p2++; //如果这地方写 p2++说明是指向下一行的指针 那么访问的时候直接使用 p2[0][j] 向该行逐个移动指针
printf("\n");

}

printf("%d ",a);
printf("%d ",&a);
printf("%d ",&a[0]); 他们三个值是一样的,说明是数组首元素的地址

附int**的使用

int **p = new int *;
int ar1[10]={1,2,3,4,5,6,7,8,910};
p[0] = ar1;//p[0]代表的是int*类型
int ar2[3]={1,2,3};
p[1] = ar2;
int * pm = p[1];
printf("%d",pm[2]);
std::cout<<pm[2];

C 再识数组指针 指针数组的概念的更多相关文章

  1. C语言-再论指针与数组

    指针与数组的天生姻缘1.以指针方式来访问数组元素(1).数组元素使用时不能整体访问,只能是单个访问.访问形式有两种:数组形式和指针形式.(2).数组形式访问数组元素:数组名[下标]:(下标从0开始(3 ...

  2. c/c++ 函数、常量、指针和数组的关系梳理

    压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和 ...

  3. 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...

  4. 11-C语言指针&一维数组&字符串

    一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...

  5. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  6. 《征服 C 指针》摘录3:数组 与 指针

    一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的 ...

  7. 《C专家编程》第四章——令人震惊的事实:数组和指针并不相同

    数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明 ...

  8. 【C语言学习】《C Primer Plus》第10章 数组和指针

    学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0 ...

  9. C++数组和指针

    <C++ Primer 4th>读书摘要 与 vector 类型相似,数组也可以保存某种类型的一组对象:而它们的区别在于,数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以 ...

  10. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

随机推荐

  1. delphi 选中的展开0级 子级不展开

    TreeView1.Selected.Expand(False); //选中的展开0级 子级不展开 TreeView1.Selected.Expand(True); //全部展开 来自为知笔记(Wiz ...

  2. Swift学习笔记(一)搭配环境以及代码执行成功

    1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.可以开发ios,mac相关的app哦!是苹果以后大力推广的语言哦! 2.Swift给你带来什么机会 ...

  3. shared_ptr的简单实现

    前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针 ...

  4. 高级I/O之非阻塞I/O

    http://www.cnblogs.com/nufangrensheng/p/3515035.html中曾将系统调用分成“低速”系统调用和其他系统调用两类.低速系统调用是可能会使进程永远阻塞的一类系 ...

  5. Linux shell 脚本攻略之文件查找与文件列表

    摘自:<Linux shell 脚本攻略>

  6. Eclipse+Axis使用WSDL文件生成Web Service服务端/客户端

    JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) WSDL文件的创建过程见http://blog.csdn.net/a19881029/ ...

  7. 24小时学通Linux内核之内存管理方式

    昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...

  8. hdu 4571 floyd+动态规划

    思路: 我们先求一遍floyd,将各点的最短距离求出,然后将点按si的升序排序.dp[i][k]表示第i个点在第j时间所获得的最大效益,那么 dp[i][k]=max(dp[ i ][ k ]  , ...

  9. SDKInitializer.initialize报错求助

    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);     ...

  10. discuze回放提示“抱歉,您的请求来路不正确或表单验证串不符,无法提交”

    不知从哪里看到文章,但是实用: 背景:discuze就单纯的录制一个注册脚本,日志中没有报错,在报告中就提示"抱歉,您的请求来路不正确或表单验证串不符,无法提交"",以下 ...