📜  用C指定的初始化程序

📅  最后修改于: 2021-05-26 01:26:27             🧑  作者: Mango

标准C90要求初始化程序的元素以固定的顺序出现,与要初始化的数组或结构中的元素的顺序相同。

在ISO C99中,您可以按随机顺序指定元素,指定它们要应用的数组索引或结构字段名称,GNU C也允许在C90模式下将其作为扩展。此扩展未在GNU C++中实现。

要指定数组索引,请在元素值前写'[index] =’或'[index]’。例如,

int a[6] = {[4] = 29, [2] = 15 }; or
     int a[6] = {[4]29 , [2]15 };

相当于

int a[6] = { 0, 0, 15, 0, 29, 0 };
Note:- The index values must be constant expressions.

要将一系列元素初始化为相同的值,请写‘[first…last] = value’ 。例如,

int a[] = {[0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

资料来源:gcc.gnu.org

// C program to demonstrate designated initializers
// with arrays.
#include 
void main(void)
{
    int numbers[100] = {1, 2, 3, [3 ... 9] = 10,
          [10] = 80, 15, [70] = 50, [42] = 400 }; 
  
    int i;
    for (i = 0; i < 20; i++)    
        printf("%d ", numbers[i]);
      
    printf("\n%d ", numbers[70]);
    printf("%d", numbers[42]);
}

输出:

1 2 3 10 10 10 10 10 10 10 80 15 0 0 0 0 0 0 0 0 
50 400 

解释:

  • 在此示例中,前三个元素分别被初始化为1、2和3。
  • 第4到第10个元素的值是10。
  • 然后将元素80(第11个元素)初始化为10
  • 下一个元素(第12个)初始化为15。
  • 元素编号70(71st)初始化为50,元素编号42(43rd)初始化为400。
  • 与普通初始化一样,所有未初始化的值都设置为零。

笔记:-

  1. 此初始化程序不需要按顺序出现。
  2. 数组的长度是指定的最大值加一。
// C program to demonstrate designated initializers
// to determine size of array.
#include 
  
void main(void)
{
    int numbers[] = {1, 2, 3, [10] = 80, 15, 
                    [70] = 50, [42] = 400 };
    int n = sizeof(numbers) / sizeof(numbers[0]); 
    printf("%d", n);
}

输出:

71

解释:
如果未给出数组的大小,则最大的初始化位置将确定数组的大小。

在结构或联合中:

在结构初始化程序中,指定要在元素值之前使用“ .fieldname =”或“ fieldname:”进行初始化的字段的名称。例如,给定以下结构,

struct point { int x, y; };

以下初始化

struct point p = { .y = 2, .x = 3 }; or
     struct point p = { y: 2, x: 3 };

相当于

struct point p = { 2, 3 };
// C program to demonstrate designated
// initializers with structures
#include  
struct Point
{
    int x, y, z;
};
  
int main()
{
      
    // Examples of initialization using
    // designated initialization
    struct Point p1 = {.y = 0, .z = 1, .x = 2};
    struct Point p2 = {.x = 20};
      
    printf("x = %d, y = %d, z = %d\n", 
          p1.x, p1.y, p1.z);
            
    printf("x = %d", p2.x);
      
    return 0;
}

输出:

x = 2, y = 0, z = 1
x = 20

我们还可以为数组和结构组合指定的初始值设定项。

// C program to demonstrate designated initializers
// with structures and arrays combined
#include 
void main(void)
{
    struct point { int x, y; };
    struct point pts[5] = { [2].y = 5, [2].x = 6, [0].x = 2 };
    int i;
    for (i = 0; i < 5; i++)    
        printf("%d %d\n", pts[i].x ,pts[i].y);
}

输出:

2 0
0 0
6 5
0 0
0 0

参考 :
https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。