C语言数组 --笔记

数组创建[]里面要给常量才可以,不能使用变量。

int arr[10]={1,2,3};//存放十个整型数组分别是1 2 3 0 0 0 0 0 0 0
char arr2[5]={'a',98};//存放5个字符常量 'a' 'b' '\0'...
char arr3[5]="ab";//存放5个字符常量'a' 'b''\0'...
char aarr4[]="abcdef";//存放'a' 'b' 'c' 'd' 'e' 'f' '\0'

很多人可能搞不清楚一个东西,下面我们来看sizeof()和strlen()的区别,首先看这样一组代码:

char arr1[]="abc";
char arr2={'a','b','c'};
printf("%d\n",sizeof(arr1));
printf("%d\n",sizeof(arr2));
printf("%d\n",strlen(arr1));
printf("%d\n",strlen(arr2));
//最后输出的值是 4 3 3 任意值

这是为什么呢? 这就要明确他们两者之间的区别:

1.首先我们要知道sizeof()和strlen()没有什么关系;

2.strlen()   是求字符串长度的(求’\0'之前的字符串长度,并且只能用来求字符串长度-----是一个库函数---使用得引头文件  ;

3.sizeof() 是计算变量,数组,类型的大小的,其求出来的单位是字节,是一个操作符

数组在内存中的存储时连续的,不管是几维数组。

数组作为函数参数:

冒泡排序:1.排序的趟数与要排序的序列的个数有关;2.每一趟进行比较的次数与要排列的个数以及处于第几躺排序有关。

#include<stdio.h>
void bubble_sort(int arr[],int sz){
int i=0;
for(i=0;i<sz-1;i++)//确定冒泡排序的趟数
{
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;//跳出外循环,不在进行比较  优化代码
}}}
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);
for(i=0;i<sz;i++){
printf("%d ",arr[i]);
}
return 0;}

在这里我们需要注意的是计算数组长度的代码只能放在主函数计算,然后再将计算出来的结果作为实参传递给冒泡排序函数的形参。这是因为如果在冒泡排序的函数中计算的话,我们要明确对arr进行传参的时候,实际上不是传递整个数组,而是传递的数组首元素的地址,所以当我们如果在冒泡排序函数中sizeof(arr)这个时候的arr是一个指针变量存储的数组首元素地址,我们知道指针变量的大小不是4就是8,在这里是4,所以最后算出来的结果就是1.但我们要得是整个数组的长度10.

说到这里我们大概对数组名是什么有了了解。总而言之,数组名就是数组首元素的地址,

但是有两个例外:

1.sizeof()内部单独放一个数组名的时候,此时此刻数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节。

2.&数组名时,数组代表整个数组,&数组名取出的是整个数组的地址。

下面我们看一串代码对此更加理解一下:

#include<stdio.h>
int main(){

int arr[]={1,2,3,4,5,6,7};
printf("%p\n",arr);//首元素地址
printf("%p\n",&arr[0]);//首元素地址
printf("%p\n",&arr);//整个数组的地址
//这三种表示虽然最后打印出来的结果一样,但是第一二个和第三个的含义不一样
printf("%p\n",arr+1);//数组首元素地址加4
printf("%p\n",&arr[0]+1);//数组首元素地址加4
printf("%p\n",&arr+1);//数组首元素地址加28,直接是跨过整个数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值