学点 C 语言(22): 数据类型 - 多维数组与指针

180it 2020-03-05 AM 1952℃ 0条

学点 C 语言(22): 数据类型 - 多维数组与指针

  1. 关于数组的首地址:

    include <stdio.h>

int main(void)
{

char cs[2][3] = {
                  {'A','B','C'},
                  {'D','E','F'}
                };
char *p1,*p2,*p3,*p4;

p1 = p2 = p3 = p4 = NULL;

/* 下面四个指针都是指向了同一个地址 */
p1 = &cs[0][0]; /* 这个最好理解 */
p2 = &cs[0];
p3 = &cs;
p4 = cs;        /* 这个最方便   */

printf("%p\n%p\n%p\n%p\n", p1, p2, p3, p4);    /* 显示地址 */
printf("\n%c %c %c %c\n", *p1, *p2, *p3, *p4); /* 显示内容 */

getchar();
return 0;

}

  1. 数组其他元素的地址:

例子中, 数组的元素在内存中应该是这样排列的:

0 0 0 1 1 1

下面是通过指针的方式获取数组的第三个元素:

include <stdio.h>

int main(void)
{

int nums[2][3] = {
                   {11, 12, 13},
                   {21, 22, 23}
                 };
int *p1,*p2;
p1 = p2 = NULL;

p1 = &nums[0][2];

p2 = nums;
p2 = p2 + 2;

// p2 = (int )nums + 2; / 或者用这一句替换上面两行 */

printf("%d, %d\n", *p1, *p2);

getchar();
return 0;

}

  1. 遍历数组的普通方法:

    include <stdio.h>

int main(void)
{

int nums[2][3] = {
                   {11, 12, 13},
                   {21, 22, 23}
                 };
int i,j;
for (i = 0; i < 2; i++) {
    for (j = 0; j < 3; j++) {
        printf("%d\n", nums[i][j]);
    }
}

getchar();
return 0;

}

  1. 通过指针遍历数组:

    include <stdio.h>

int main(void)
{

int nums[2][3] = {
                   {11, 12, 13},
                   {21, 22, 23}
                 };
int *p = nums;

int i;
for (i = 0; i < 6; i++) {
    printf("%d\n", *(p+i));
}

getchar();
return 0;

}

include <stdio.h>

int main(void)
{

char cs[2][3] = {
                  {'A','B','C'},
                  {'D','E','F'}
                };
char *p = cs;

unsigned i;    
for (i = 0; i < sizeof cs / sizeof cs[0][0]; i++) {
    printf("%c\n", *p++);
}

getchar();
return 0;

}

include <stdio.h>

int main(void)
{

char cs[2][3] = {
                  {'A','B','C'},
                  {'D','E','F'}
                };
int i;
for (i = 0; i < 6; i++) {
    printf("%c\n", *(*cs + i)); // *cs 是什么? 看下例
}

getchar();
return 0;

}

  1. 再探数组的指针地址:

    include <stdio.h>

int main(void)
{

char cs[2][3] = {
                  {'A','B','C'},
                  {'D','E','F'}
                };

//在本例中(二维数组)
// cs 是指向数组 cs[0] 的地址
// *cs 是指向 cs[0][0] 的地址
printf("%p, %p\n", cs, *cs);

// **cs 指向 cs[0][0] 的值
printf("%c, %c\n", **cs, cs[0][0]);   

getchar();
return 0;

}

  1. 使用指针遍历三维数组:

    include <stdio.h>

int main(void)
{

char cs[2][2][3] = {
                     {
                       {'A','B','C'},
                       {'D','E','F'}
                     },
                     {
                       {'1','2','3'},
                       {'4','5','6'}
                     }
                   };
int i;
int count = sizeof cs / sizeof cs[0][0][0];

for (i = 0; i < count; i++) {
    printf("%c\n", *(**cs + i));
}

getchar();
return 0;

}

  1. 遍历多维数组还是用指针变量更容易理解:

    include <stdio.h>

int main(void)
{

char cs[2][2][3] = {
                     {
                       {'A','B','C'},
                       {'D','E','F'}
                     },
                     {
                       {'1','2','3'},
                       {'4','5','6'}
                     }
                   };
char *p = (char *)cs;  /* 相对上面的例子, 这里加了类型转换; 这样编译器就没有提示了 */
                   
int i;
int count = sizeof cs / sizeof cs[0][0][0];
for (i = 0; i < count; i++) {
    printf("%c\n", *p++);
}

getchar();
return 0;

}

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

学点 C 语言(22): 数据类型 - 多维数组与指针