c语言二位数组与指针

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

void main()
{
    int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };

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

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

void main()
{
    int num[5] = { 1,2,3,4,5 };
    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 就是指向整个数组的地址。

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

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

  

时间: 2025-01-31 05:23:17

c语言二位数组与指针的相关文章

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

今天分析了C语言二维数组和指针的基本理解,感觉有点懵...代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> //void func(int p[][]) //这样写等同于void func(int **p) p++移动了四个字节,(*p)++移动了四个字节,不符合二维数组规律 //{ //} //列优先输出的函数(即竖着输出) void func

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

C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按照16位.32位.64位为单位进行编辑的话:旧的16位处理器,比如Intel 80286 CPU需要8个指令,32位的处理器需要4个指令,而64位处理器则只要两个指令,显然,在工作频率相同的情况下,64位处理器的处理速度会比16位.32位的更快.而且除了运算能力之外,与32位处理器相比,64位处理器

二位数组与指针

#include<stdio.h> #include<iostream> using namespace std; void disparry(int a[2][3]) { printf("\n%d,%d,%d",a[0][0],a[0][1],a[0][2]); } int main(void) { int arr[2][3]={{2,3,1}, {23,45,6}}; //c是一个指针,指向的元素int[3],即arr的行元素 int (*c)[3]=arr

直观理解C语言中指向一位数组与二维数组的指针

一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

程序猿之--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_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

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

主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

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

1 /* 2 Name: 对二维数组使用指针进行操作的探索 3 Copyright: 4 Author: lingr7 5 Date: 01/12/18 11:55 6 Description: 7 */ 8 #include<stdio.h> 9 int main() { 10 11 int a[2][3] = {{1,2,3},{4,5,6}}; 12 int **p = a;/*这一步,将a存放的地址赋值给了p,这一步是的p与a完全等价*/ 13 int *p2 = p;/*这一步就将a

C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include <cstdio> void print(int *a[3]) { printf("%d\n",a[0][0]); } int main() { int a[2][3] = {1,2,3,4,5,6}; print(a); return 0; } 编译程序时候,在第10行提示错误信息:|

二位数组中的查找——杨氏矩阵

------------------------------------------------------------------------------------------------- "杨氏矩阵":即数组元素从左向右依次递增,从上到下依次递增.要想在该数组中查找数,首 先该数组得满足"杨氏矩阵"的特点.为了方便理解我们可以将一个二位数组看作是一个矩阵,假设i 为行,j为列,数组为str,那么只要满足(str[i][j]<str[i][j+1] &a