二维数组(循环数组——魔方阵)、数组指针与指针数组、const

一、二维数组
逻辑上,矩阵形式;
内存中,线性连续;
当指针和数组在同一内存中时,arr-p = 相隔元素数

*行指针 —(解引用)—> 列指针

//"[]"——解引用
arr[0] = *(arr + 0) = arr;
brr[0][1] = *(brr[0] + 1) = *(*(brr + 0) + 1); 
//定义、初始化
int arr[2][3];
int arr[2][3] = {{1,2,3},{4,5,6}};
int arr[3][4] = {{1},{5,6}};
int arr[3][4] = {{1},{5,6},{}};
int arr[2][3] = {{1},{5,6}};
int arr[2][3] = {1,2,3,4,5,6};
int arr[][3] = {0};//省略行数时,必须说明列数并赋初值
//二维数组数组名:数组指针
&arr //数组名地址

arr //
&arr[0] //数组首元素(第一行——>数组)地址

arr[0] //数组首行整体地址

&arr[0][0] //数组首元素(首行首列的元素)地址
//做参数
int fun(int (*arr)[3],int n)
int fun(int arr[][3],int n) 
 //功能和用法完全相同
fun(&arr[0],2);
fun(b,2);
//*行指针 —(解引用)—> 列指针
int *p = arr[2] + 1 ;//*(arr+2)——>&arr[2]——>&arr[2][1]
printf("%d\n", *p);//6  

这里写图片描述

//内存连续
int brr[3][3] = {1,2,3,4,5,6,7,8,9};
brr[1][0] == brr[0][3];//内存连续
int main()
{
     int a[3][4]={1,3,5,7, 9,11,13,15, 17,19,21,23};
     printf("%x, %x\n",a, *a);//7bfa04,
     printf("%x, %x\n",a[0], *(a+0));
     printf("%x, %x\n",&a[0], &a[0][0]);

     printf("%d, %d\n",a[1], a+1);//8124948

     printf("%d, %d\n",&a[1][1], *(a+1)+1);//8124952

     printf("%d, %d\n",a[2], *(a+2));//8124964
     printf("%d, %d\n",&a[2],a+2);

     printf("%d,%d\n", a[1][0], *(*(a+1)+0));//9

     printf("%d, %d\n",*a[2],*(*(a+2)+0));//17
     getchar();
     return 0;
}

魔方阵:

//⑴将1放在第一行中间一列;
//⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,
//列数加1(例如三阶魔方阵,5在4的上一行后一列);
//⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,
//列数同样加1;
//⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
//⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。
//例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

#include<stdio.h>
#define MAX 3
//魔方阵
void Metrix()
{
    int i;
    int j;
    int arr[MAX][MAX] = {0};
    int row = 0;
    int col = MAX / 2;
    arr[row][col] = 1;
    for(i = 2; i <= MAX*MAX; i++)
    {
        if(arr[(row-1+MAX)%MAX][(col+1)%MAX] != 0)
        {
            row = (row+1)%MAX;
        }
        else
        {
            row = (row-1+MAX)%MAX;
            col = (col+1)%MAX;
        }//循环数组
        arr[row][col] = i;
    }
    for(i = 0; i < MAX; i++)
    {
        for(j = 0; j < MAX; j++)
        {
            printf("%4d", arr[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    Metrix();
    getchar();
    return 0;
}

二、数组指针与指针数组
1、数组指针:指向数组的指针

int (*brr)[3];//元素类型为int,指针brr指向数组元素

2、指针数组:存放指针的数组

int *arr[3] = int *(p[3]);//元素类型为int *

这里写图片描述

三、关于const
1、指针:
(1)解引用:*p = 10 ;
(2)指向变量:p = &a ;

2、指针与const:

//不可解引用(1)
const int *p;
int const *p;//常量*p

//指向不可变(2)
int *const p2;//常量指针

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_39191122/article/details/79666251
今日推荐