C语⾔array数组的⽤法详解⽬录
⼀维数组的创建与初始化
程序⼀:
程序⼆:
程序三
程序四(⼆维数组 - ⼆维数组的列绝对不能省略)
⼆维数组在内存中的存储
程序⼀
数组作为函数参数,怎么作?
实例:冒泡排序游戏名字大全
数组名:
⼀维数组的创建与初始化
数组是⼀种相同类型元素的集合
程序⼀:
#include<stdio.h>
#include<string.h>
int main()
{
创建⼀个数组
int arr1[10];// [常量]
初始化 int arr[10]={1,2,3};不完全初始化,剩下的元素默认初始化0.
char arr2[5];
初始化 char arr[5]={'a','b'};,不完全初始化,剩下元素默认初始化0.
初始化 char arr[5]="ab" 这是可⾏的,因为隐藏⼀个'\0',后⾯的0使我们⾃⼰给的(这个字符串都给给它的==),不是系统默认int n = 5;
char ch[n]; 这样创建数组是错误,因为n还是变量,值是被赋值了,并不会改变它的属性
char arr3[5] = { 'a', 98/*b的ASCII码等于98*/ };//可⾏
上式等价于下式
char arr3[5] = {'a','b'}
char arr4[] = "abcd";//加上后⾯隐藏的'\0',⼤⼩为5
当我们并没有指定⼤⼩的时候,它会根据后⾯的数据,⾃⼰给定⼤⼩
char arr5[] = "abcdef";
printf("%d\n",sizeof(arr5));// 7 sizeof晕倒'\0',把它算进去,在停⽌计算
printf("%d\n", strlen(arr5));//6 strlen是遇到'\0'(不包含),就停⽌计算
char arr6[] = { 'a', 'b','c','\0' };
printf("%d\n",strlen(arr6));//如果没有'\0'结束标志符,它会⼀直算个数,直到遇到'\0',输出的是⼀个随机数
printf("%d\n", sizeof(arr6));//没有'\0'它就少算⼀个就是3
return 0;
}
程序⼆:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "abcdef";//元素下标是从0开始
pritnf("%c\n",arr[0]); //arr[0] == a,表⽰⾸元素a,输出结果为a
dateline如果要依次打印字符串所有元素⽤循环更简单,字符串的 '\0' 是隐藏的,⼀般是不⽤打印的
int i = 0;
int len = strlen(arr);// 计算元素个数
for (i = 0; i < len; i++)
{
printf("%c ",arr[i]);// a b c d e f
}
return 0;
}
程序三
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr) / sizeof(arr[0]);
// sizeof(数组名)计算的整个数组的字节⼤⼩,我们只要再求⼀个元素的⼤⼩就可以了,因为数组是⼀相同类型数据的集合,所以我
// 假设 int a[10];数组 a 有 10个 int(4byte)类型的元素,整个数组的⼤⼩就是 4*10 == 40 byte,数组⼤⼩除以数组元素⼤⼩,不就是数组元素个数嘛。(40/4 == 10) int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
printf("&arr[%d]=%p\n",i,&arr[i]);// 打印数组对应下标元素的地址
}
return 0;
}
程序四(⼆维数组 - ⼆维数组的列绝对不能省略)
#include<stdio.h>
int main()
{
///int arr[3][4];//存储⼀个三⾏四列的数据 3是⾏(3个⼀维数组),4是列
int arr1[3][4] = {1,2,3,4,5};
假设数据是这样存的,在内存是连续存储的
1234
5000
0000
int arr2[3][4] = { { 1, 2, 3 } , { 4, 5 } };
冒泡排序代码c语言1 2 3 0
4 5 0 0
0 0 0 0
shell脚本传入不固定参数⼀⾏的数据是根据元素加个后⾯的{ },⽅便你们去区分,再根据列数确定⼀⾏有多少个元素
int arr3[][4] = { { 1, 2, 3 }, { 4, 5 } };
1 2 3 0
4 5 0 0
⼆维数组不管⾏还是列,下标都是从0开始,⽽且⼆维数组的⾏是可以省略的,它会根据元素和列的值,来确定⾏数
int arr4[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 ",arr4[i][j]);1 2 3 0
4 5 0 0
0 0 0 0
}
printf("\n");
}
return 0;
}
⼆维数组在内存中的存储
在内存中实际存储情况,第⼀⾏完了,第⼆⾏紧跟在第⼀⾏,第三⾏紧跟在第⼆⾏,int a[2][2]={1,2,3,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("arr[%d][%d]=%p\n", i, j, &arr[i][j]);
arr[0][3]和arr[1][0]地址相差4,⼆维数组与⼀维数组⼀样,都连续存储
}
}
return 0;
}
数组作为函数参数,怎么作?
实例:冒泡排序
#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
确定冒号排序的趟数
杭电oj1000答案解析int i = 0;
for (i = 0; i < sz - 1; i++)// 排序要排元素总个数-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 (1 == flag)
{
break;
request方法}
}
}
int main()
{
int arr[] = { 0, 8, 7, 6, 5, 4, 3, 2, 1, 9 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
对数组arr进⾏传参,传递的是数组arr⾸元素的地址
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);//0,1,2,3,4,5,6,7,8,9
}
return 0;
}
数组名:
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7 };//数组随着下标的增长,地址是由低到⾼变化点
printf("%p\n",arr);
数组名就是数组⾸元素地址,是⼀样的。见附图1
printf("%p\n",&arr[0]);
但有两个意外
1.sizeof(数组名) - 数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位为字节(byte) int sz = sizeof(arr);
printf("%d\n",sz);// 4(元素⼤⼩)* 7(元素个数)== 28,效果见附图 2
2.&(数组名),数组名代表整个数组,&数组名,取的是整个数组的地址
printf("%p\n", &arr);//表⽰数组的起始地址,是整个数组的地址
上下两者的值⼀样,但意义完全不同,效果图见附图 3
printf("%p\n", arr);//⾸元素的地址
//进⼀步论证 &arr 和 arr的意义完全不同,不同在哪⾥
printf("%p\n", &arr+1);//地址增加28字节,⼀个元素4byte,7个元素28字节,意味着 &arr + 1 跳过⼀整个数组的元素,指向最后⼀个元素后⾯的地址
printf("%p\n", arr+1);//地址增加4字节,意味着 arr +1,跳过⼀个元素,改地址 arr+1,指向第⼆个元素
效果见附图 4
return 0;
}
关于数组名,有兴趣的,可以看看我这篇⽂章
附图1;
附图2:
附图3:
附图4:
本⽂结束
到此这篇关于C语⾔ array数组的⽤法详解的⽂章就介绍到这了,更多相关C语⾔ array数组内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论