菜单开关

周梦康 发表于 2017-09-24 1328 次浏览 标签 : C语言快速入门

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

定义同一类型多个元素的集合
本质一片连续的内存空间
内存分布数组在内存的分布式连续排列的

数组的初始化示例

#include <stdio.h>

int main(int argc, char const *argv[])
{

    int a[4];//初始化的时候就已经申请了内存了

    for (int i = 0; i < 4; ++i)
    {
        a[i] = i;
    }

    for (int i = 0; i < 4; ++i)
    {
        printf("%d,%p\n", a[i],&a[i]);
    }
    
    return 0;
}

执行结果如下

0,0x7fff5fa2ca70
1,0x7fff5fa2ca74
2,0x7fff5fa2ca78
3,0x7fff5fa2ca7c

细看初始化

数值类型初始化

初始化内存占用描述
int num1[3] = {1,2,3};12正常赋值
int num2[3] = {1,2};12没有初始化的元素,填充为0。
double num3[3] = {1,2};24不足的元素,填充为0.0000... , 数组类型声明,对其进行转换
double num4[] = {1,2};16确定了元素个数,可以省略中括号里面的元素个数的描述

占用内存我是以我当前环境为参考 https://mengkang.net/989.html

char 数组初始化

初始化内存占用
char a[] = {'a','b','c','d'};4
char b[4] = {"abcd"};4
char c[] = {"abcd"};5
char d[4] = "abcd";4
char e[] = "abcd";5

双引号初始化的时候,如果申请的内存空间够用的情况下,会在末尾放置一个\0

知识是网状的,这块和字符串的知识相关联,但是初始化却是数组的,所以在这里讲解吧。
下面是字符数组的两种初始化

#include <stdio.h>

int main(int argc, char const *argv[]) {
    char a[] = {'a', 'b', 'c', 'd'};
 
    printf("a 的长度 %lu\n", sizeof(a));
 
    for (int i = 0; i < sizeof(a); ++i) {
        printf("%c,ascii 码为 %d\n", a[i], a[i]);
    }
 
    return 0;
}

结果为

a 的长度 4
a,ascii 码为 97
b,ascii 码为 98
c,ascii 码为 99
d,ascii 码为 100

特殊的初始化,双引号多字符组合初始化:

#include <stdio.h>

int main(int argc, char const *argv[]) {
    char a[] = "abcd";
    
    printf("a 的长度 %lu\n", sizeof(a));
    
    for (int i = 0; i < sizeof(a); ++i) {
        printf("%c,ascii 码为 %d\n", a[i], a[i]);
    }
    
    return 0;
}

结果

a 的长度 5
a,ascii 码为 97
b,ascii 码为 98
c,ascii 码为 99
d,ascii 码为 100
,ascii 码为 0

发现在初始化的时候,在字符串的末尾添加了一个ascii码为0的字符\0,这时候字符串的终止符,这就是双引号初始化的特殊性

二维数组

type arrayname[x][y];

初始化方式列举

#include <stdio.h>

int main(int argc, char const *argv[]) {

    int a[2][3] = {
            {1, 2, 3},
            {4, 5, 6}
    };

    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 3; ++j) {
            printf("%d\n",a[i][j]);
        }
    }

    return 0;
}
#include <stdio.h>

int main(int argc, char const *argv[]) {

    int a[2][3] = {1, 2, 3, 4, 5, 6};

    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 3; ++j) {
            printf("%d\n",a[i][j]);
        }
    }

    return 0;
}

上面两种效果一样。

int main(int argc, char const *argv[]) {

    int a[2][3] = {1};

    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 3; ++j) {
            printf("%d\n",a[i][j]);
        }
    }

    return 0;
}

输出结果

1
0
0
0
0
0

和一维数组一样,其他未声明的内存都用0都填充。因为类型是int

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表