首页 > 其他分享 >【我开了C语言的金手指】三.数组

【我开了C语言的金手指】三.数组

时间:2022-10-08 12:10:37浏览次数:53  
标签:sz arr int 金手指 C语言 我开 数组 printf sizeof

(一)一维数组的创建和初始化

1.数组的创建

数组是一组相同类型元素的集合,

其创建方式为:​​type_t arr_name [const_n]​

注:

type_t是数组类型

const_n是一个常量表达式,用来指定数组的大小

实例:

​int arr1[10]​​正确

​int count=10;int arr2[count]​​错误

2.数组的初始化

​int arr1[10]={1,2,3};​​不完全初始化,剩下的元素默认初始化为0

​char arr2[5]={'a','b','c'};​​为a,b,c,

​char arr2[5]="abc"​​亦可以初始化,为a,b,c,\0,

​char arr4[]="abcdef";​​为a,b,c,d,e,f,\0, 共七个

注:

#include<stdio.h>
#include<string.h>
int main()
{
char arr4[] = "abcdef";
printf("%d\n", sizeof(arr4));
printf("%d\n", strlen(arr4));
return 0;
}

【我开了C语言的金手指】三.数组_#include

sizeof是计算arr4所占空间大小

strlen是在求字符串长度(遇到\0停止,不计数\0;没遇到\0就随机大小)

strlen和sizeof无任何联系;

strlen是求字符串长度的;只针对字符串求长度;是库函数,要引用头文件;

sizeof是计算变量,数组,类型的大小;单位是字节;是操作符;

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = {'a','b','c'};
printf("%d\n", sizeof(arr1)); //4 a,b,c,\0
printf("%d\n", sizeof(arr2)); //3 a,b,c
printf("%d\n", strlen(arr1)); //3 a,b,c
printf("%d\n", strlen(arr2)); //随机数 a,b,c.....
return 0;
}

【我开了C语言的金手指】三.数组_#include_02

"abc"___a,a,c,\0字符型数组结尾有\0

{1,2,3,4}___1,2,3,4整形数组结尾无\0

3.一维数组的使用

对于数组的使用,之前我们了解了下标引用操作符[]。它其实就是数组访问的操作符。代码如下:

#include<stdio.h>
int main()
{
char arr[] = "abcdef";
int i = 0;
for (i = 0; i <= strlen(arr); i++)
printf("%c ", arr[i]);//arr数组名+[3]下标=这个数
return 0;
}

此时虽然可以运行,但因为strlen输出默认为无符号数,所以可以优化为:

​(int)strlen(arr)>=i; ​​​或​​int len=strlen(arr);len>=i;​

总结

数组是可以通过使用下标来访问的,下标是从0开始;

数组的大小可以通过计算得到。

3.一维数组在内存中的存储

#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i <= sz; i++)
printf("arr[%d]=%p\n", i, &arr[i]);//&arr[i]是取i时的地址
return 0;
}

 

【我开了C语言的金手指】三.数组_数组_03

每个地址差4;元素是整形,占4个字节;

所以数组连续存放

(二)二维数组的创建和初始化

1.二维数组的创建

​int arr[3][4]​​  表示三行四列

    int  int  int  int

    int  int  int  int

    int  int  int  int

#include<stdio.h>
int main()
{
int arr[3][4] = { 1,2,3,4,5 };
return 0;
}

我们发现这样写会先用1 2 3 4把一行放满后,再用5放第二行

那怎么样才能现在第一行放1 2 3,就直接再第二行放4 5?

可以这样

#include<stdio.h>
int main()
{
int arr[3][4] = { {1,2,3},{4,5} };
return 0;
}

2.二维数组的初始化

​int arr [][4]={1,2,3,4}​​即使初始化,行可以省略,但是列不可以省略。

#include<stdio.h>
int main()
{
int arr[3][4] = { {1,2,3},{4,5} };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}

【我开了C语言的金手指】三.数组_#include_04

#include<stdio.h>
int main()
{
int arr[3][4] = { {1,2,3},{4,5} };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("&arr[%d][%d]= %p\n", i, j, &arr[i][j]);
}
}
return 0;
}

【我开了C语言的金手指】三.数组_#include_05

我们可以看到不同行的地址仍是连续的。

(三)数组作为函数参数

在写代码的时候,会将数组作为参数传入函数,比如:我们要实现一个冒泡排序函数,将一个整型数组排序。

1.冒泡函数

错误编写  低效

int bubble_sort(int arr[],int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)//n个元素需要n-1次排序
{
int j = 0;
for (j = 0; j < sz-1-i; j++)//每一趟排序
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz); //相当于传了&arr[0],直接改变主程序
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}

我们发现无论数组是否已经排好序,程序都会将次数运行完;

正确编写

#include<stdio.h>

int bubble_sort(int arr[],int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)//n个元素需要n-1次排序
{
int flag = 1;
int j = 0;
for (j = 0; j < sz-1-i; j++)//每一趟排序
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag == 1)//优化
break;//break不用于选择,此时用于循环
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz); //此处arr传的是首元素的地址
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}

2.数组名

#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6 };
printf("%p\n", arr);
printf("%p\n", &arr[0]);
printf("%d\n", *arr);
return 0;
}

结论:数组名就是首元素地址;

两个例外:

​sizeof(arr)​​此时计算的时整个数组的大小

​&arr​​结果虽然相同,但取的是整个数组的地址

【我开了C语言的金手指】三.数组_数组_06

给arr加1后,可以发现,&arr多加了整个数组的字节

【我开了C语言的金手指】三.数组_#include_07

(四)数组越界

数组下标有范围限制,超过这个限制就会数组越界访问,此时编译器不一定报错,但不代表程序正确。














标签:sz,arr,int,金手指,C语言,我开,数组,printf,sizeof
From: https://blog.51cto.com/u_15796276/5737126

相关文章

  • C语言每日一题——第十一天
    第十一天还记得在第三天写的斐波那契数列程序吗?小明最初想用这个函数作为随机数生成器的。今天,小明决定重新拾起这个函数,用于生成随机数……输入程序在运行时通过getcha......
  • C语言:随机出题
    #include<stdio.h>//为小学一年级学生随机出10道题,加法或减法随机出现,保证涉及到的数在0-9之间,结果不能出现负数//程序运行输入结果后提示对或错,最后并统计做对了几道......
  • 实现进制转化伪代码的C语言转化
    #include<stdio.h>intmain(){  intx,p;  printf("Enterthenewbase");  scanf("%d",&p);  printf("Enterthenumbertobeconverted"); ......
  • 【C语言】初始数组
    ......
  • 初探C语言第三天
    选择结构程序设计if语句1.if(判断条件)执行动作;或if(判断条件){执行动作超过一个} 这次没有;​2.if(判断条件)语句1;else 语句2;3.嵌套条件句注意else和上面最接近的if配对,如若有......
  • 初学C语言笔记221007预处理
    预编译:#include头文件的包含    注释删除    #define汇编代码二进制指令预定义符号__FILE____LINE____DATE____TIME____FUNCTION____STDC__如果严格支持AN......
  • 【我开了C语言金手指】二.函数(2)
    (七)函数递归1.什么是递归?程序调用自身的编程技巧;过程或函数在其定义或说明中有直接或间接调用自身的一种方法,把大型复杂问题转化为一个与原问题相似的规模较小的问题来求解;主......
  • C语言——指针(初阶)
    指针是什么指针和指针类型野指针指针运算指针和数组二级指针指针数组一.指针是什么指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。将......
  • 初学C语言笔记221007
    鹏哥花了点时间教大家投资fread返回值是真实读到的元素个数while(fread(&s,sizeof(structS),1,fp){//}课后扩展mySQLfseekftellintpos=ftell(fp); //文件指针相对......
  • C语言每日一题——第十天
    第十天随着对指针了解的深入,小明决定进一步尝试指针的使用。他写出一个程序,用于判断给定数组内最长连续字母串的长度。运行:main.exeabcdefea输出:6解释:ab......