C:数组以及数组相关的简单运算

1、数组的创建:

形如int arr [10] 即为一个数组
可表示为数组元素类型+数组名+[常量或常量表达式]
该数组类型为 int [10]。
数组名即为一个指针,此概念会在下文详细讲解。

2、数组的初始化:

创建数组时应养成将其第一时间初始化的习惯,否则新建的数组里均为随机值;

一维数组初始化
当创建一维数组时,若不进行初始化,则一定要指定数组大小
ex: int arr [10];
若进行初始化则可以省略制定数组大小
ex: int arr[10] ={1};
初始化数组时若 int arr[] ={x};则初始化数组中第一个元素为x,其余元素默认初始化为0.
明确初始化即将数组中每个元素初始化为制定值,此时不用指定数组大小

ex: int arr[] ={1,2,3,4,5}
当将字符串放进数组时,默认其字符串后有\0,若存放的是字符数组则不考虑。
ex: int arr1[] =”abc”这其中共有四个元素。
int arr2[] ={“a”,”b”,”c”}这其中有三个元素。

3、下标引用操作符[]

数组通过下标(从0开始)来访问。

4、数组中各元素的存储地址是连续的。
5、数组计算常用代码

计算数组大小: len= sizeof(arr)/sizeof(arr[0]);
查看数组中各元素地止: printf(“&arr[%d]=p%\n”,i,&arr[i]);

6、在数组中指针的应用:

int*p = arr;
则*(p+i)=arr[i]=p[i]
由1式知p指向arr的首元素地址,所以对p+i进行解引用便是对arr中第i个元素的地址进行解引用,即为p[i]。所以可知数组名在实际计算机执行程序的过程中可以视为指针.

1.除sizeof(单个数组名)以及“”&数组名“”中数组名表示整个数组,其余所有数组名均表示该数组的首元素地址。
2.数组地址与数组首元素地址指向的是相同位置,但其类型并不相同,为指针类型和数组指针类型所若对这两个指针进行+1,则分别代表指向整个数组后一位的地址与指向数组第二个元素地址。
7、二维数组
1.二维数组是线性的,即连续储存。
2.二维数组初始化时只可省略第一维的数组大小。
3.形如二维数组arr3[3][4]可理解为一个三行四列的数组,但在实际存储中由于内存是扁平的,所以可理解为在实际存储中arr3是一个由三个元素组成的一维数组,其中每个元素又是由四个元素组成的另外的一维数组;

即—> arr3[0][0]arr3[0][1]arr3[0][2] + arr3[1][0]arr3[1][1]arr3[1][2] + arr3[2][0]arr3[2][1]arr3[2][2][2]

4.二维数组arr3[3][4]的数组名arr3表示的是其三个元素数组中的首个数组arr3[0][i]的地址,若需找到arr3的首元素地址则应写为&arr3[0][0]或arr3[0].
8、数组的计算

sizeof()求的是变量或者空间开辟空间的大小,sizeof() 在进行传参时不进行计算值,即不考虑此变量的值是否为真,而仅仅需要的是这个变量的类型。而strlen()函数则求字符串长度,参数接收的必须是一个有效地址

学习了这么多,来牛刀小试一下吧:

#include <stdio.h>  
1.
int main()  
{  
    int a[]={1,2,3,4};    
    printf("%d\n",sizeof(a));  //16   a中所有元素所占空间大小为4*4字节
    printf("%d\n",sizeof(a+0));  //4  a中第一个元素所占空间大小 
    printf("%d\n",sizeof(*a));  //4   a中第一个元素所占空间大小(a解引用还是a)
    printf("%d\n",sizeof(a+1));  //4  同2 
    printf("%d\n",sizeof(a[1]));  //4 a第2个元素所占空间大小  
    printf("%d\n",sizeof(&a));  //4   整个数组地址还是一个地址,所有32位环境下的地址均为4
    printf("%d\n",sizeof(&a+1));  //4 整个数组后一位地址  
    printf("%d\n",sizeof(&a[0]));  //4第一个元素地址 
    printf("%d\n",sizeof(&a[0]+1));  //4第二个元素地址   
    return 0;  
}   
2.
#include <stdio.h>  
int main ()  
{  
    char arr[]={'a','b','c','d','e','f'};  
    printf("%d\n",strlen(arr));  // 随机数 数组中没/0,函数会一直查下去在随机地方遇到/0报值   
    printf("%d\n",strlen(arr+0));  // 随机数 从首元素开始向后找
    //printf("%d\n",strlen(*arr));  //报错 首元素'a'的地址在ASCII中无法查询
    //printf("%d\n",strlen(arr[1]));  // 报错 同上 
    printf("%d\n",strlen(&arr));  //随机数  从数组地址即首元素地址开始向后找没/0,随机
    printf("%d\n",strlen(&arr+1));  // 随机数-6 整个数组后开始找,依然随机
    printf("%d\n",strlen(&arr[0]+1));  // 随机数-1 从数组第二元素开始查找
    return 0;  
}  
3.
#include <stdio.h>  
int main()  
{  
    char *p="abcdef";  
    printf("%d\n",sizeof(p));  // 4 指针变量32环境下为4 
    printf("%d\n",sizeof(p+1));  //4 b的地址大小 
    printf("%d\n",sizeof(*p));  //1  a的大小 
    printf("%d\n",sizeof(p[0]));  //1 a大小=arr[0]  
    printf("%d\n",sizeof(&p));  // 4  指针的地址大小依然为4 
    printf("%d\n",sizeof(&p+1));  // 4 指针后一位地址依然为地址 
    printf("%d\n",sizeof(&p[0]+1));  // 4 b地址 
    return 0;  
}  
4.
#include <stdio.h>  
int main()  
{  
    char *p="abcdef";  
    printf("%d\n",strlen(p)); // 6 p内存放首字符地址,从这里开始知道遇到/0结束
    printf("%d\n",strlen(p+1));  //5 从第二个开始计算
    printf("%d\n",strlen(*p)); // 报错 将a的ASCII值地址传进后,非法访问 
    printf("%d\n",strlen(p[0]));  //  报错 将a的ASCII值地址传进后,非法访问 
    printf("%d\n",strlen(&p)); //随机数 从指针变量的地址开始找谁知道啥时候有/0
    printf("%d\n",strlen(&p+1));  //随机数 从指针变量的地址的下一个地址开始找谁知道啥时候有/0  
    printf("%d\n",strlen(&p[0]+1)); //5 从第二个开始计算
    return 0;  
}  
5.
#include <stdio.h>  
int main()  
{  
    int a[3][4]={0};  
    printf("%d\n",sizeof(a));  // 48 a中所有元素所占空间大小 
    printf("%d\n",sizeof(a[0][0]));   //4 第一个元素所占空间大小  
    printf("%d\n",sizeof(a[0]));  // 16 a[0][i]中元素所占空间大小 
    printf("%d\n",sizeof(a[0]+1)); //4 第二个元素地址
    printf("%d\n",sizeof(a+1));  //4  a[1][i]地址所占空间大小
    printf("%d\n",sizeof(&a[0]+1)); //4 a[1][i]地址所占空间大小
    printf("%d\n",sizeof(*a));  //  16  a[0][i]中元素所占空间大小 
    printf("%d\n",sizeof(a[3]));  //16 a[2][i]中元素所占空间大小 
    return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值