问题,以下输出的结果是什么,区别在于哪?

void main()
{
int a[][] = { ,,,,,,,,,,, }; //输出的3个地址都一样,差别在哪?
printf("\n%x",a);
printf("\n%x",*a);
printf("\n%x",&a);
system("pause");
}

  像我这种野生码农看到这个问题基本懵了,好吧我们先通过一维数组来理解。

void main()
{
int num[] = { ,,,, };
printf("\n%x", num); //第一个元素的首地址,1个int元素4个字节
printf("\n%x", &num); //数组的地址,数组5个元素,20个字节。 //printf("\n%d", (*(&num))[2]); 可以知道 (*(&num))就是数组 {1,2,3,4,5}-> &num是指向整个数组的地址 //区别
printf("\n%d", sizeof(*num)); //4 *num 根据类型地址取出内容 => 1 ,4字节
printf("\n%d", sizeof(*&num));//20 *&num 根据类型地址取出内容 getchar();
}

  通过上面的例子,可以知道

  1. num就是指向数组的首地址,由此可得 *num 就是数组首地址的值 1。

  2. &num 就是指向整个数组的地址。

于是我们再来看上面二维数组的例子解答。

 void main()
{
int a[][] = { ,,,,,,,,,,, }; //打印出整个数组的元素和对应的地址
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
printf("%d,%x ",*(*(a+i)+j), *(a + i) + j);
}
printf("\n");
} //3个结果都一样,差别在哪?
printf("\n%x",a); //a行指针
printf("\n%x",*a); //a行指针的值 {1,2,3,4}
printf("\n%x",&a); //整个二维数组的地址 printf("\n%d",sizeof(*a));// 16 -> *a代表一个行的数组 {1,2,3,4} ,
printf("\n%d", sizeof(**a));// 4 -> 有上可以推断 **a 代表第一行数组首地址 1
printf("\n%d", sizeof(*&a));// 48 -> &a代表整个二维数组的首地址,则 *(&a) 取整个二维数组的内容,12个元素,则48 个字节 system("pause");
}

  

c语言二维数组与指针的更多相关文章

  1. 关于c语言二维数组与指针的个人理解及处理办法。

    相信大家在学习C语言时,对一维数组和指针的理解应该是自信的,但是,我在学习过程中,看到网上一些博文,发现即便是参加工作的一些专业编程人员,突然碰到二维数组和指针的问题时,也可能会遇到难以处理的诡异问题 ...

  2. C语言 二维数组(指针)动态分配和释放(转)

    C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...

  3. 二维数组和指针(C语言)

    二维数组和指针 二维数组和指针1.二维数组和数组元素的地址若有以下定义:int *p, a[3][4]; 1)二维数组a由若干个一维数组组成在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的 ...

  4. 程序员之--C语言细节13(二维数组和指针,&amp;*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)

    主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_C ...

  5. C语言教学--二维数组和指针的理解

    对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...

  6. c语言编程-----指向二维数组的指针

    c中如何返回一个指向二维数组的指针 #include <stdio.h> #include <stdlib.h> #define COUNT 3 typedef int (*M ...

  7. 对二维数组使用指针进行操作的探索(C语言)

    /* Name: 对二维数组使用指针进行操作的探索 Copyright: Author: lingr7 Date: 01/12/18 11:55 Description: */ #include< ...

  8. c语言二维数组传递

    c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维 ...

  9. C语言多维数组的指针传递

    在C语言中为了节省空间,提高运行速度经常使用指针来完成数组的传递. 对于一维数组而言可以直接传递首地址 而对于二维数组必须在传递时声明是二维数组的指针,并且调用时也要经过一些运算 首先是定义形参: 函 ...

随机推荐

  1. 量化分析:把Tushare数据源,规整成PyalgoTrade所需格式

    量化分析:把Tushare数据源,规整成PyalgoTrade所需格式 分析A股历史数据,首先需要确定数据来源.如果只想做日k线.周k线的技术分析,可以用PyalgoTrade直接从yahoo.goo ...

  2. 《DSP using MATLAB》Problem 2.19

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  3. 关于const 和指针

    这个很久之前就很困扰的问题,现在再理一下: 1,指向const对象的指针 >C++强制要求指向const对象的指针也必须具有const特性!!!也就是不能把一个const对象的地址赋给一个非co ...

  4. [TopCoder14647]HiddenRabbits

    vjudge description 有一棵\(n\)个节点的树和\(m\)只兔子,每只兔子要住在一个点上(可以多只兔子住在同一个点上).有\(q\)组要求,每组形如"当以\(r\)为根时, ...

  5. Java移位运算符 “

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zjx409/article/details/37569055 左移运算符(<<) 基本使 ...

  6. 关于Android应用开发的一些安全注意事项

    原文地址: http://www.javacodegeeks.com/2014/05/simple-tips-to-secure-android-app.html                   ...

  7. Oracle按时间段分组统计

    想要按时间段分组查询,首先要了解level,connect by,oracle时间的加减. 关于level这里不多说,我只写出一个查询语句: ----level 是一个伪例 ---结果: 关于conn ...

  8. eaccelerator详解

    之前在看书的时候看到一个eaccelerator,以前也没用过 不知道是啥东东,不知道以后会用到不,先mark一下吧 eAccelerator是一个自由开放源码php加速器,优化和动态内容缓存,提高了 ...

  9. java之RestTemplate的访问应用

    一.REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格.它是 ...

  10. KVC & KVO 入门

    KVC: 简介: 全称 Key-Value Coding .KVC是一种间接访问对象属性(用字符串表征)的机制,而不是直接调用对象的accessor(setter/getter)方法或是直接访问成员对 ...