数组
来源:互联网 发布:lte数据功能收费吗 编辑:程序博客网 时间:2024/05/21 11:26
- 一维数组
- 定义
- 初始化
- 访问数组
- 数组大小计算
- 数组的存储
- 二维数组
- 关于数组的运算
一维数组
定义
数组类型 数组名[数组大小];
数组定义时, [ ]中要给一个常量才可以,不能使用变量。
const修饰的变量是常变量,仍然是变量
初始化
数组可以只定义不初始化,但数组大小要明确指出
也可以不指出数组大小,在定义时初始化:
int arr1[ ] = {1,2,3};
数组的元素个数根据初始化的内容来确定。
如果非要给出大小,数组大小应大于给出初始化内容的个数
字符数组有两种初始化方式:
1.char arr1[] = {‘a’,’b’,’c’};
2.char arr2[] = “abc”;
这两种有区别,双引号里的内容代表字符串,末尾有一个隐藏的结束符’\0’,所以char arr2[] = “abc”; 等同于char arr1[] = {‘a’,’b’,’c’,’\0’};
访问数组
数组是使用下标来访问的,下标从0开始。
[],下标引用操作符。它其实就数组访问的操作符。
如果没有给数组赋初值,那么就要使用[]一个一个给数组元素赋值。
数组大小计算
对于字符串数组,可以用strlen函数计算大小(还不包括结束符),那么其他数组的大小怎么得到呢?
用关键字sizeof:
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
sizeof(arr)计算整个数组的大小
sizeof(arr[0])计算单个元素的大小
只要是数组,至少也有1个元素吧,用这种方法,就可以得到数组的大小了
数组的存储
数组在内存中是连续存储的
#include <stdio.h>int main(){int arr[10] = {0};int i = 0;for(i=0; i<sizeof(arr)/sizeof(arr[0]); ++i){printf("&arr[%d] = %p\n", i, &arr[i]);}return 0;}
整型的大小是四个字节,第一个元素的地址+4刚好是第二个元素的地址,由此可见,数组是连续存储的
数组名是数组首元素的地址
数组是可以用指针访问的,而且a[0]=*(a+0)
二维数组
其实各种概念和一维数组类似,二维数组可以看成是数组的数组
比如 int arr[3][4]; 它可以看成是三个数组,数组名分别为arr[0],arr[1],arr[2],每个数组有4个元素
对了 二维数组定义的时候第二维的大小不能省略。
二维数组的存储其实不是像我们想象的那样第几行第几列那样的,它其实是连续的。
验证一下:
#include <stdio.h>int main(){ int arr[3][4]; 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;}
关于数组的运算
#include<stdio.h>#include<string.h>int main() { //一维数组 int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(a));//16 a单独在sizeof里,表示整个数组,计算整个数组的大小 printf("%d\n", sizeof(a + 0));//a表示数组首元素的地址,即int型地址,4个字节 printf("%d\n", sizeof(*a));//*a=*(a+0)=a[0],a[0]是int型,即4个字节 printf("%d\n", sizeof(a + 1));//a表示数组首元素地址,+1后表示第二个元素的地址,仍然是一个地址,4个字节 printf("%d\n", sizeof(a[1]));//4 printf("%d\n", sizeof(&a));//4,整个数组的地址 printf("%d\n", sizeof(&a + 1));//4,整个数组的地址+1,即紧跟数组最后一个元素的地址 printf("%d\n", sizeof(&a[0]));//a[0]的地址,4个字节 printf("%d\n", sizeof(&a[0] + 1));//a[1]的地址,4个字节 return 0; }
#include<stdio.h>#include<string.h>int main() { //字符数组 char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", sizeof(arr));//arr表示整个数组,计算整个数组的大小,6 printf("%d\n", sizeof(arr + 0));//arr表示首元素的地址,4 printf("%d\n", sizeof(*arr));//*arr=*(arr+0)=a[0],1 printf("%d\n", sizeof(arr[1]));//1 printf("%d\n", sizeof(&arr));//整个数组的地址,4 printf("%d\n", sizeof(&arr + 1));//紧邻整个数组之后的地址,4 printf("%d\n", sizeof(&arr[0] + 1));//arr[1]的地址,4 printf("%d\n", strlen(arr));//首元素开始,到结束符共有多少个字符,没有结束符,没办法算,随机值 printf("%d\n", strlen(arr + 0));//同上// printf("%d\n", strlen(*arr));//*arr=*(arr+0)=arr[0]='a',strlen的参数是一个地址,参数类型不符// printf("%d\n", strlen(arr[1]));//同上 printf("%d\n", strlen(&arr));//整个数组的地址开始,到结束符,没有结束符,随机值 printf("%d\n", strlen(&arr + 1));//上值-6 printf("%d\n", strlen(&arr[0] + 1));//上值+5 reuturn 0;}
#include<stdio.h>#include<string.h>int main() { char *p = "abcdef"; printf("%d\n", sizeof(p));//p是char*类型,内容为首元素a的地址,4 printf("%d\n", sizeof(p + 1));//b的地址,4 printf("%d\n", sizeof(*p));//*p = *(p+0)=p[0]=‘a’,1 printf("%d\n", sizeof(p[0]));//1 printf("%d\n", sizeof(&p));//p的地址 4 printf("%d\n", sizeof(&p + 1));//整个数组之后的地址,4 printf("%d\n", sizeof(&p[0] + 1));//p[1]的地址4 printf("%d\n", strlen(p));//6 printf("%d\n", strlen(p + 1));//5// printf("%d\n", strlen(*p));//'a',参数类型不符合// printf("%d\n", strlen(p[0]));//同上 printf("%d\n", strlen(&p));//和字符串无关了,随机值 printf("%d\n", strlen(&p + 1));//少四个字节,上值-4 printf("%d\n", strlen(&p[0] + 1));//5 return 0;}
#include<stdio.h>#include<string.h>int main() { //二维数组 int a[3][4] = { 0 }; printf("%d\n", sizeof(a));//a表示整个数组,计算的是整个数组的大小 3*4*4=48 printf("%d\n", sizeof(a[0][0]));//4 printf("%d\n", sizeof(a[0]));//a[0]表示第一行数组的大小,4*4=16 printf("%d\n", sizeof(a[0] + 1));//= a[0]+1 = &a[0][0]+1 = &a[0][1] ,4 printf("%d\n", sizeof(a + 1));//a代表首元素的地址,这时的首元素是第一行的数组名 = &a[0]+1 = &a[1],4 printf("%d\n", sizeof(&a[0] + 1));//同上 printf("%d\n", sizeof(*a));//*a=*&a[0]=a[0] ,16 printf("%d\n", sizeof(a[3]));//没有a[3],但sizeof才不理会这些,和前边a[0],a[1]类似,结果是16 return 0;}
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 如何将无法显示的NTFS硬盘显示到桌面上
- 23 hashtable&unordered_set&unordered_map深度探索(学自Boolean)
- 详解Java中的clone方法 -- 原型模式
- pat-1136. A Delayed Palindrome (20) 模拟
- 你有没有过奋不顾身的爱情,然后痛彻心扉的失去,你有过吗?
- 数组
- TensorFlow之基本结构
- WebService远程调用技术--学习02
- 图论——最短路
- SparkSQL的前世今生
- 分布式事务之说说TCC事务
- poj 3661 runnning 区间dp
- PAT 乙级 1076 WIFI密码
- CURL 访问https 发生 NSS error -12190 错误