C语言数组基本概念理解(共8篇)由网友“一川烟草0330”投稿提供,下面是小编给大家带来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;i篇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 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 } 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); ★ 计算机考试大纲 ★ 数据结构课程总结 ★ vba心得体会 ★ c语言学习总结 ★ 备课教案 【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篇8:C语言变长数组data[0]