C语言数组基本概念理解

时间:2023-01-01 07:45:56 其他范文 收藏本文 下载本文

C语言数组基本概念理解(共8篇)由网友“一川烟草0330”投稿提供,下面是小编给大家带来C语言数组基本概念理解,一起来阅读吧,希望对您有所帮助。

C语言数组基本概念理解

篇1:C语言数组基本概念理解

数组基本概念

变量类型 变量名;

元素类型 数组名[元素个数]; // 数组中保存的每一个数据,我们称之为元素

特点:数组只能存放同一种数据类型

数组中的每一个元素都有一个索引号,索引号从0开始部分初始化, 没有赋值的元素默认是0

数组[]中的元素个数只能写整型常量,以及返回值是整型常量的表达式通过变量定义数组,如果没有对数组进行初始化,里面存放的是一些垃圾数据(随机值)在定义数组的同时进行初始化,可以省略元素个数,会自动的计算出数组元素的个数要想给数组一次性赋值(给数组中所有的元素赋值)只能在定义数组的同时,如果定义完数组之后,就不能再对数组进行一次性的赋值数组的地址就是它第0个元素的地址,数组名就是数组的地址

数组元素存放值是从小到大, 而每一个元素存值又是从大到小

因为内存寻址从大到小,所以先定义的数组的地址比后定义的地址大

基本数据类型作位函数参数是值传递

数组作为函数参数传递的是地址

当数组作为函数参数传递的时候,可以省略[]中的元素个数

当数组作为函数参数传递的时候,会自动转换成“指针类型”

而指针在当前操作系统mac 下占用8个字节

想在函数中动态计算数组的元素个数是不行的,因为指针类型占8个字节

选择排序原理:依次选择数组中过的每一个元素和其他元素进行比较

当内循环执行完一次(比较完一次), 最值出现在头角标上

冒泡排序原理: 冒泡排序是拿相邻的两个元素进行比较

特点: 内循环执行完一次(完整的比较完一次),最值出现在尾角标上,

C语言数组基本概念理解

篇2:C语言实验报告《数组》

C语言实验报告《数组》 -实习报告

学号:__________    姓名:__________    班级:__________    日期:__________指导教师:__________    成绩:__________实验三  数组一、 实验目的1、掌握一维和二维数组的`定义、赋值和输入输出2、掌握字符数组和字符串数组的使用3、掌握与数组有关的排序算法二、 实验内容1、 已有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。(习题7.4)2、 将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。(习题7.5)3、 如下程序是按选择法对数组中的n个元素按从小到大的顺序排序,请对程序中的错误进行改正,使其正常运行。        #include  #define N 20        void main        {            int a[N]={9,6,8,3,-1};            int i,m;            printf(before sort:);            for(i=0;ibsp;        }三、 实验步骤与过程第一┆范文网www.diyiFANWEN.com整理该文章,版权归原作者、原出处所有... 四、程序调试记

篇3:深度理解C语言的指针与数组

写个简单的yuv读取的库,卡在多维数组动态分配的问题上,唉,还是C基本功不扎实,于是花了一下午时间,算是给自己有了点交代。参考《C专家编程》。水平有限,欢迎看客指正。

Section 1 左值与右值

编译器为每个变量分配一个地址(左值),该地址在编译时可知,且变量在运行时一直存于该地址。存于该地址的变量的值(右值)只有在运行时可知。因此,编译器如果需要一个地址来执行某种操作,它可以直接进行操作,如果需要一个变量的值,它需要发出指令从指定地址中读入变量值并存于寄存器中。到这里,可以理解作为一个指针变量,它本身的地址是左值,它变量的值(即指向的地址值)为右值。所以指针首先需要在运行时取得它的当前值,然后才能对它进行解除引用操作。

数组名是一个左值,即内存中的位置。但数组名是一个不可修改的左值,即不可被赋值。

int main()

{

int a[3] = {0};

int b = 1;

a = &b; //ERROR: “=” : 左操作数必须为 l 值。

return 0;

}

Section 2 数组与指针的不同

一个例子:

int main()

{

char arr[4] = “abc”; // Note 1

//char arr[4] = {''a'', ''b'', ''c'', ''\0''}; // Note 2

char *ptr = “ABC”; // Note 3

//ptr+1 = &arr[2]; // Note 4

printf(“arr: %x, %x, %x %x \n”, &arr, &arr[0], &arr[1]); //Note 5

printf(“ptr: %x, %x, %x %x \n”, &ptr, &ptr[0], &ptr[1]);

return 0;

}

Note 1&2等价定义,其结构如下:

a b c \0

[__] [__] [__] [__]

12fed4 +1 +2 +3

Note 3结构如下

42703c A B C \0

[__] [__] [__] [__] [__]

12fec8 42703c +1 +2 +3

Note 4复习一下Section 1.显然的错误,因为p+1首先需要知道p的值(右值),只有在运行时刻才能得到,编译时刻就希望对其所在的地址进行赋值显然错误,

Note 5验证Note1和3,运行结果如下:

arr: 12fed4, 12fed4, 12fed5

ptr: 12fec8, 42703c, 42703d

可以发现,arr的地址(左值)的结果与数组中首元素的地址一致,而ptr的变量值(右值)与数组的首元素地址一致。

因此对一个数组中的元素进行引用,c=arr[i]和c=ptr[i]都能够取出相应数组中的第i个元素。但要注意这两个操作的过程完全不同:

c = arr[i]; c = ptr[i];

1:取地址12fec8的内容,即42703c

1 取出i的值与12fed4相加 2:取出i的值与42703c相加

2 取地址(12fed4+ i)的内容 3:取地址(42703c+i)的内容

得到结论:尽管c=arr[i]和c=ptr[i]用同样的形式完成了同样的功能,但绝不可以混用。注意数组原始的声明方式,如果原始声明为数组式的,那么对其元素的引用要使用数组形式,反之亦然。

文件1中:

篇4:大一c语言数组实验心得

试验目的 1、掌握一维数组和二维数组的定义、赋值和输入输出的方法; 2、掌握字符数组和字符串函数的使用; 3、掌握与数组有关的算法特别是排序算法。 二、实验内容 教材习题P1527.2 三、算法流程图 四、程序清单 include void main {inti,j,min,s,a[11]; printf“请输入数组

“; fori1;i10;i {printf“a[d]“,i; scanf“d“, } printf“

“; printf“原数据为

“; fori1;i10;i printf“5d“,a[i]; printf“

“; fori1;i9;i {mini; forji1;ja[j] minj; sa[i]; a[i]a[min]; a[min]s; }printf“排好序的数组为

“; fori1;i10;i printf“5d“,a[i]; printf“

“; } 五、运行结果 六、实验总结(调试分析和体会)这个星期我对使用数组进行程序设计的学习,在之前的基础上,我更加努力,课前先预习,上课认真听,经过我的努力我进步了很多,虽然有了很大的进步,但在学习上还是存在很多问题。但这次的作业比上周的条件结构程序好多了。经过自己的努力,我已经掌握一维数组和二维数组的定义、赋值和输入输出的方法;掌握字符数组和字符串函数的使用;掌握与数组有关的算法特别是排序算法。这一单元数组跟以前的选择结构程序设计和循环控制相比,内容要繁琐得多,程序语句没有以前那么明了,要经过认真的思考,在经过自己思考后,即使是自己懂得算法的原理后,要来调程序又困难重重,一个程序要经过认真思考和反复的调试程序,才能完成。在多次的练习下,我基本上能结合程序掌握一些算法。通过多次的实验操作,我的操作能力有了很大的进步,但在学习的过程中并非一帆风顺,特别是在对程序的语句上,问题特别多。但我经过耐心地操作和虚心地请教终于掌握了正确的操作方法

篇5:大一c语言数组实验心得

指针是c语言的精华,也是c语言的难点,它就像一把双刃剑,锋利无比但运用的不好也会给自己带来危害,后果比较严重,所以重点来说说指针。

很多初学者弄不清指针和数组到底有什么样的关系,为避免混淆不清,下面总结一下指针和数组的特性。

指针是保存数据的地址,任何存入指针变量的数据都会被当作地址来处理,指针变量本身的地址由编译器另外存储,存储在哪里,我们并不知道,间接访问数据,首先取得指针变量的内容,把它作为地址,然后从这个地址读或写入数据。

指针可以用间接访问操作符(_)访问,也可以用以下标的形式访问,指针一般用于动态数据结构。

数组是用来保存数据的,数组名代表的是数组首元素的地址而不是数组的首地址,所以数组p与&p是有区别的,虽然内容相同,但意义却不同,&p才是整个数组的首地址,数组名是整个数组的名字,数组内每个元素并没有名字,不能把数组当一个整体来进行读写操作。

当然数组在初始化时也有例外,如int p[]=“12345”是合法的。

数组可以以指针的形式访问如_(p+i);也可以以下标的形式访问p[i],但其本质都是p所代表的数组首元素的地址加上i_sizeof(类型)个字节作为数据的真正地址来进行访问的。

数组通常用于存储固定数目且数据类型相同的元素。

刚开始的时候我

有点分不清指针数组和数组指针,现在也总结一下,指针数组,首先它是一个数组,数组的每个元素都是指针,可以理解为“存储指针的数组”的简称,数组指针,首先它是一个指针,它指向一个数组,在32位系统下永远只占4个字节,至于它指向的数组有多少个字节,并不知道,可以理解为“指向数组的指针”。

举个例子,int _p1[10]与int (_p2) [10], 要理解这个问题,首先要清楚操作符的优先级,“[]” 的优先级比“_”的优先级高,所以首先p1与“[10]”结合构成一个数组p1[10],int _为修饰数组的内容,所以数组元素是指向int类型的指针,所以这个是指针数组,“”的优先级比“[]”的优先级高,“_”与p2结合构成一个指针变量,int修饰数组的内容,即数组的每个元素,数组这里并没有名字,是个匿名数组,现在清楚了p2是一个指针,它指向一个包含10个int类型数据的数组,即为数组指针。

下面再说说内存管理,内存分为三个部分:静态区、堆、栈。

其实堆栈就是栈,而不是堆。

静态区是保存自动全局变量和static变量。

静态区的内容在整个程序的生命周期内都存在,由编译器在编译的时候分配。

堆是由malloc系统函数分配内存的。

其生命周期由free和delete决定。

栈保存局部变量。

栈上的内容只在函数范围内存在,当函数运行结束,这些内容也会自动被销毁。

再说说有关内存需要注意的地方,定义了指针变量,在使用之前一定要初始化使它指向一块合法的内存,不管什么时候,我们在使用指针之前一定要确保指针是有效的。

使用malloc系列函数分配内存,使用完之后应及时释放内存,以防止内存泄露。

最后总结的说一下学习c语言的方法就是编程编程再编程,理论学习与上机操作同时进行,另外在编程序的过程中要养成良好的编程习惯。

篇6:C语言全局数组与局部数组

今天同学遇到一个在C语言中全局数组和局部数组的问题,卡了许久,我也没有第一时间看出问题,现在把问题梳理一下,并给出解决方案,

问题描述:

在全局声明的数组与在局部声明的数组有着不同的效果。

首先来看一个程序:

#include

#include

#define MAX 10

char a[MAX];

int main()

{

int i;

char b[MAX];

char *c=(char *)malloc(MAX * sizeof(char));

printf(“\nArray a:\n”);

for(i=0;i

printf(“%d ”,a[i]);

printf(“\nArray b:\n”);

for(i=0;i

printf(“%d ”,b[i]);

printf(“\nArray c:\n”);

for(i=0;i

printf(“%d ”,c[i]);

printf(“\nDone”);

free(c);

return 1;

}

编译运行结果:

程序主要功能是打印字符数组的Ascii码。可以发现全局数组a和动态生成的数组c有着相同的结果,而局部声明的数组b确被分配了随机的数值,也许这就是问题的所在。

解决方案:

#include

#include

#define MAX 10

char a[MAX]={0};

int main()

{

int i;

char b[MAX]={0};

char *c=(char *)malloc(MAX * sizeof(char));

printf(“\nArray a:\n”);

for(i=0;i

printf(“%d ”,a[i]);

printf(“\nArray b:\n”);

for(i=0;i

printf(“%d ”,b[i]);

printf(“\nArray c:\n”);

for(i=0;i

printf(“%d ”,c[i]);

printf(“\nDone”);

free(c);

return 1;

}

运行结果:

在数组的初始化中,假设初始化的数值个数小于数组的大小,则全部用0来填充,

这里通过初始化一个值,就可以给数组一个确定的结果。

(在不同系统和不同的编译器可能会出现不同的结果)

还有一个小问题就是C语言中空格的问题,看下面的程序。

#include

#include

#define MAX 10

int main()

{

int i;

char b[MAX]={0};

gets(b);

printf(“\nArray b:\n”);

for(i=0;i

printf(“%d ”,b[i]);

printf(“\nDone”);

return 1;

}

在这里,我输入了“ int”(三个空格+int),打印的结果如上图。

b中前三个记录了空格的Ascii码,即32。

b中后面没有使用的空间依然是0。

打完收工。

篇7:C语言对数组的各种操作操作

#include#include//初始化数组void init(int arr[], int length){ int i = 0; printf(“初始化数组->:\n ”); for (i = 0; i:\n”); for (i = length - 1; i >= 0; i--)//数组下标是从0开始的 { printf(“%d ”, arr[i]); }}//清空数组(即数组中元素全部为零)void empty(int arr[], int length){ int i = 0; printf(“清空数组->:\n”); for (i = 0; i

篇8:C语言变长数组data[0]

1、前言

今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0].这样设计的目的是让数组长度是可变的,根据需要进行分配,方便操作,节省空间。

2、data[0]结构

经常遇到的结构形状如下:

struct buffer

{

int data_len; //长度

char data[0]; //起始地址

};

在这个结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体buffer之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。

写个程序对比char data[0],char *data, char data[],如下所示:

1 #include

2 #include

3 #include

4 #include

5

6 typedef struct

7 {

8 int data_len;

9 char data[0];

10 }buff_st_1;

11

12 typedef struct

13 {

14 int data_len;

15 char *data;

16 }buff_st_2;

17

18 typedef struct

19 {

20 int data_len;

21 char data[];

22 }buff_st_3;

23

24 int main()

25 {

26 printf(“sizeof(buff_st_1)=%u\n”, sizeof(buff_st_1));

27 printf(“sizeof(buff_st_2)=%u\n”, sizeof(buff_st_2));

28 printf(“sizeof(buff_st_3)=%u\n”, sizeof(buff_st_3));

29

30 buff_st_1 buff1;

31 buff_st_2 buff2;

32 buff_st_3 buff3;

33

34 printf(“buff1 address:%p,buff1.data_len address:%p,buff1.data address:%p\n”,

35 &buff1, &(buff1.data_len), buff1.data);

36

37 printf(“buff2 address:%p,buff2.data_len address:%p,buff2.data address:%p\n”,

38 &buff2, &(buff2.data_len), buff2.data);

39

40 printf(“buff3 address:%p,buff3.data_len address:%p,buff3.data address:%p\n”,

41 &buff3, &(buff3.data_len), buff3.data);

42

43 return 0;

44 }

从结果可以看出data[0]和data[]不占用空间,且地址紧跟在结构后面,而char *data作为指针,占用4个字节,地址不在结构之后。

3、实际当中的用法

在实际程序中,数据的长度很多是未知的,这样通过变长的数组可以方便的节省空间。对指针操作,方便数据类型的转换。测试程序如下:

1 #include

2 #include

3 #include

4 #include

5

6 typedef struct

7 {

8 int data_len;

9 char data[0];

10 }buff_st_1;

11

12 typedef struct

13 {

14 int data_len;

15 char *data;

16 }buff_st_2;

17

18 typedef struct

19 {

20 int data_len;

21 char data[];

22 }buff_st_3;

23

24 typedef struct

25 {

26 uint32_t id;

27 uint32_t age;

28 }student_st;

29

30

31 void print_stu(const student_st *stu)

32 {

33 printf(“id:%u,age:%u\n”, stu->id, stu->age);

34 }

35

36 int main()

37 {

38 student_st *stu = (student_st *)malloc(sizeof(student_st));

39 stu->id = 100;

40 stu->age = 23;

41

42 student_st *tmp = NULL;

43

44 buff_st_1 *buff1 = (buff_st_1 *)malloc(sizeof(buff_st_1) + sizeof(student_st));

45 buff1->data_len = sizeof(student_st);

46 memcpy(buff1->data, stu, buff1->data_len);

47 printf(“buff1 address:%p,buff1->data_len address:%p,buff1->data address:%p\n”,

48 buff1, &(buff1->data_len), buff1->data);

49

50 tmp = (student_st*)buff1->data;

51 print_stu(tmp);

52

53 buff_st_2 *buff2 = (buff_st_2 *)malloc(sizeof(buff_st_2));

54 buff2->data_len = sizeof(student_st);

55 buff2->data = (char *)malloc(buff2->data_len);

56 memcpy(buff2->data, stu, buff2->data_len);

57 printf(“buff2 address:%p,buff2->data_len address:%p,buff2->data address:%p\n”,

58 buff2, &(buff2->data_len), buff2->data);

59

60 tmp = (student_st *)buff2->data;

61 print_stu(tmp);

62

63 buff_st_3 *buff3 = (buff_st_3 *)malloc(sizeof(buff_st_3) + sizeof(student_st));

64 buff3->data_len = sizeof(student_st);

65 memcpy(buff3->data, stu, buff3->data_len);

66 printf(“buff3 address:%p,buff3->data_len address:%p,buff3->data address:%p\n”,

67 buff3, &(buff3->data_len), buff3->data);

68

69 tmp = (student_st*)buff1->data;

70 print_stu(tmp);

71

72 free(buff1);

73

74 free(buff2->data);

计算机专业课复习数据结构复习重点

C++基础教程数组

计算机考试大纲

c语言实践报告总结

数据结构课程总结

提高计算机专业C语言教学效果的方法探讨

vba心得体会

c语言学习总结

备课教案

全国计算机等级考试二级MSOffice高级应用考试大纲

C语言数组基本概念理解
《C语言数组基本概念理解.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【C语言数组基本概念理解(共8篇)】相关文章:

大学c语言学习心得体会感想2022-11-09

c语言学习心得2023-07-20

教师活页教案2023-12-02

计算机二级JAVA考试巩固试题及答案2022-12-04

教学对象分析2023-05-30

大学c语言学习心得体会2023-04-22

教师的教案怎么写2022-12-12

C和指针 (pointers on C)――第十二章:使用结构和指针2022-05-23

C语言嵌套注释2022-09-23

教师教案模板2024-04-19

点击下载本文文档