一维数组
来源:互联网 发布:奚梦瑶 知乎 编辑:程序博客网 时间:2024/05/24 03:12
一、数组的定义
1、整型
(1)
int arr[5];//全未初始时,默认随机值
int arr[5] = {1,2};//部分未初始时,默认0
int arr[5] = {1,2,3,4,5};//数组内个元素依次对应赋值
int arr[] = {1,2};//此时数组长度为2(两个元素)
(2)不允许数组整体赋值,可以单元素进行赋值
int arr[5] = {1,2};
arr[3] = 3//此时数组第三个元素值为3
2、字符
字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值
(1)字符数组:
char str[10]={ 'I',' ','a','m'};//部分未赋值时,默认'\0'char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};
(2)字符串:
char str[ ]={"I am happy"};//三者均等价char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','/0'}; char str[ ]="I am happy";
C语言中字符数组和字符串定义和初始化的问题
二、数组名的含义
作为数组名代表整个数组;
作为指针代表数组的首元素地址(数组首元素的首地址);
arr,&arr 同值不同作用域
&arr[i]和arr+i含义相同,即arr+i是arr之后第i个元素地址
sizeof(arr);//整个数组所占内存长度sizeof(&arr);//整个数组的地址的占用空间长度arr+1;//移动一个元素后的长度//arr[1]&arr+1;//跨过arr数组的下一个地址
1、计算数组长度(数组元素个数):
int len = sizeof(arr) / sizeof(arr[0]);//arr占用内存长度除以其首元素字节长度
2、与sizeof:
int arr[5];&arr;//int (*)[4];也就是指向包含4个int数据的数组的指针。sizeof(arr);//20//整个数组所占内存长度sizeof(&arr);//4//整个数组的地址的占用空间长度sizeof(arr[0]);//4sizeof(arr[5]);//4//预编译,仅判断类型计算占用字节大小sizeof(&arr[0]);//4sizeof(&arr[5]);//4
三、数组越界问题
四、数组与指针
//arr == &arr[0] int arr[5];int *p = arr;//p是一个指向int类型的指针,p = arr,就是把数组的首地址赋给p,即 p 现在就是指向数组的首地址,通过 p 就可以访问整个数组,但是p这里只是是个指针变量,也就是 p 的本质没有改变,p不能和arr一样代表整个数组的内存,所以sizeof(p) == sizeof(int*) != sizeof(arr)。把数组的首地址赋给 p,但 p 的本质一个int类型的指针变量,所以也就可以对 p 进行 ++ 之类的运算。p+1;//p->arr[1]
五、野指针
“野指针”不是NULL指针,是指向被释放的或者访问受限的垃圾内存的指针。
关于野指针
六、数组传参与传址
1、值传递:把值传递给函数作为参数。
void fun(int a,int b,int c){a=456;b=567;c=678;}void main(){int x=10,y=20,z=30;fun(x,y,z);printf("%d,%d,%d\n",x,y,z);}最后的输出结果是10,20,30
当调用函数时是以值的方式来传递的话,形参的值发生变化,而实参的值并没有跟着形参一起改变
2、地址传递:把地址传递给函数作为参数(指针、数组传递)。
void Swap(int *a,int *b); //用于交换两个变量值,需要地址,如果只传值,交换后原变量不会改变{ int temp = *p; *p = *q; *q = temp;}Swap(&a,&b);//调用
当调用函数时是以地址的方式来传递的话,形参的值发生变化,实参的值也跟着形参一起改变;要是想实现变量的真正交换,必须要用地址传递,而指针和数组名传递其实是一回事
3、对于数组:
在使用数组做参数时,编译器会自动将数组名转换为指向数组第一个元素的指针
void Fun(int *arr);void Fun(int arr[]);void Fun(int arr[5]);//三者意相同
代码改善:
(1)增加参数len, 限定元素个数
void Fun(int* arr, int len){ for (int i = 0; i < len; ++i) { printf("%d\n",arr[i]) ; }}
(2)传递数组的引用,避免被转换为指针,而且有了元素个数的信息,调用的时候,也必须传递一个含有3个元素的数组
void Fun(int (&arr)[3]){ for (int i = 0; i < 3; ++i) { printf("%d\n",arr[i]) ; }}
七、左值与右值:在C语言中表示位于赋值运算符两侧的两个值,左边的就叫左值,右边的就叫右值。
1、左值
L-value中的L指的是Location,表示可寻址
左值表示存储在计算机内存的对象,相当于地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作,因此左值可被赋值(常量除外),赋值中可以放在赋值操作符两边。 所有的引用都是左值。
2、右值(数组元素arr[i]可作)
R-value中的R指的是Read,表示可读
当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值,右值相当于数据值 。右值是表达式的值(不是引用),可以放在赋值右面。
所有的左值都可以是右值,反之不成立
- 数组(一维数组)
- 数组---一维数组
- 数组(一维数组)
- java数组--一维数组
- 一维数组,字符数组
- 一维数组、二维数组
- 一维数组&三维数组
- Java数组 一维数组,二维数组
- array 数组 一维数组 二维数组
- 一维数组、数组排序、字符数组
- Javascript - 数组 一维数组 二维数组
- 一维数组
- 一维数组
- oracle一维数组
- hdu2955robberies一维数组
- 一维数组
- 一维数组?
- 一维数组
- 利用Python,四步掌握机器学习
- eclipse开发常用快捷键
- Java根据UA判断手机,平板,PC登录
- 什么是SYN Flood攻击?
- linux进程
- 一维数组
- 使用maven为web工程引入jstl包时报错
- 大话keepalive
- tesseract-ocr+VS2015配置问题
- C#的配置文件App.config使用总结
- SpringMVC 设置produces决定返回的数据格式
- CP2102介绍
- java获取map中值最小的
- (分治算法)两个有序数组中的中位数和Top K问题