数组的初始化和二维数组、指针与数组

简介:

1、数组的初始化,比较简单,实例程如下:

1
2
3
4
5
6
7
8
9
#include<stdio.h>
# define M 12
int  main( void ){
int  days[M]={31,28,31,30,31,30,31,30,30,31,30,31};
int  i;
for (i=0;i<M;i++)
printf ( "Months %d has %2d days.\n" ,i+1,days[i]);
return  0;
}

运行结果如下:

wKiom1mFclGASF3AAAAbKFdFV3Y993.png

2.未经初始化的数组:

实例程序;

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
# define M 12
int  main( void ){
int  N[M]; //未经初始化的数组
int  days[M]={31,28,31,30,31,30,31,30,30,31,30,31};
int  i;
for (i=0;i<M;i++)
//printf("Months %d has %2d days.\n",i+1,days[i]);
printf ( "%d  %d\n" , i,N[i]);
return  0;
}

运行结果:

wKiom1mFdDri7apAAAAYrBIX32k377.png

由此可知,在初始化之前,数组元素的值是不确定的,编译器使用的数值是存储单元中已有的数值,上面的输出结果是不一定的。

3、在初始化数组的时候,编译器很机智,即使你给的元素数目小于或者为给定数组大小,编译器会自动识别,不够的话,它会自己用0代替。但是当初始化列表中有太多对的数目时,编译器会提醒错误。too many initializers太多初始化。如下删去几个元素,则结果:

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
# define M 12
int  main( void ){
int  N[M]; //未经初始化的数组
int  days[M]={31,28,31,30,31,30,31,30};
int  i;
for (i=0;i<M;i++)
printf ( "Months %d has %2d days.\n" ,i+1,days[i]);
//printf("%d  %d\n", i,N[i]);
return  0;
}

wKiom1mFdXOjwzWwAAAu-P9F5DE654.png

4、二维数组,举个栗子:float rain[5] [12] 首先,rain[5]表示一个包含五个元素的数组,至于每个元素的情况,需要查看声明的其余部分。剩余的便是float【12】,表示12浮点数的 数组。总之,该二维数组表示:rain具有5个元素,并且每个元素都是包含12个数值的数组。

具体理解画图如下:也算是挺明了的了。

wKioL1mFmnizRzCMAAQqD84Jjmo021.jpg



5、指针和数组

指针提供了用来一种用来使用地址的符号方法。由于计算机的硬件指令很大程度上依赖于地址,所以指针能够使您以类似于计算机底层的底层的表达方式来表达自己的意愿。这使得应用了指针的程序能够更高效的工作,特别的,指针能够很有效的处理数组。

例子:数组名同时也是该数组首元素的地址。如a是一数组,则a==&a[0]//数组名是该数组首元素的地址。

指针加法:示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#define SIZE 4
int  main( void ){
short  dates [SIZE];
short  *pti;
short  index;
double  bills[SIZE];
double  * ptf;
pti=dates; //把数组赋值给指针
ptf=bills;
printf ( "%23s %10s\n" , "short" , "double" );
for (index=0;index<SIZE;index++)
printf ( "pointers+%d: %10p %10p\n" ,index,pti+index,ptf+index);
return  0;
}

运行结果:

wKioL1mH8Sfi-0-JAABajKhZSQ4868.png

解析:我们的系统是按字节编制的,short类型使用两个字节,double类型8个字节,在C中,对一个指针加1的结果是对该指针增加一个存储单元。对于数组而言,地址会增加到下一个元素的地址,而不是下一个字节,这就是为什么在声明指针时必须声明它所指的对象类型,计算机需要知道存储对象所用的字节数。

关于指针:

指针的数值就是它所指向对象的地址,地址的内部表示方式是由硬件决定的,很多计算计算机都是以字节编址的,这意味着对每个内存字节顺序进行编号,对于包含多个字节的数据类型,比如double,对象的地址通常指首字节的地址。

在指针前运用*就可以得到该指针所指向的对象的数值。

对指针加1 ,等价于对指针的值加上他指向对象的字节的大小。




本文转自 lillian_trip 51CTO博客,原文链接:http://blog.51cto.com/xiaoqiaoya/1953866,如需转载请自行联系原作者
相关文章
|
10月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
115 3
|
10月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
10月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
10月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
10月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
10月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
194 4
|
10月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
112 2
|
10月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
834 13
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
428 4
|
11月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
137 0