数组的运算
在进行数组运算之前, 首先,我们需要对 arr, &arr, &arr[0]有一个很好的了解
看代码:
运行结果:
可见三者的值相同,那么三者是不是绝对相同呢?
再仔细分析下列代码:
运行结果:
由此得出结论:虽然arr, &arr, &arr[0]三者值相同,但三者类型并不相同
数组名-----arr 表示数组首元素的地址
arr+1 则表示第二个元素的地址
&arr[0] 表示第一个元素的地址
&arr[0]+1则表示第二个元素的地址
&arr 表示整个数组的地址
&arr+1 则跳过整个数组
有关数组的运算
经过上面的分析后,接下来正式开始数组的运算
这里简单介绍下sizeof() 和 strlen()
sizeof() C/C++操作符
作用:返回类型所占的内存字节数
strlen(字符数组) 一个函数
作用:测量字符串长度的函数。函数的值为字符串的实际长度(不包括’\0’在内)
注:strlen()参数必须是字符型指针(char*),且必须是以’\0’结尾的
1.一维数组
这里需要注意 sizeof()什么时候测量数组大小
分析: sizeof(a) 数组名放于sizeof()内部,表示整个数组的大小,单位字节
sizeof(a+0) 不是数组名放于sizeof()内部,则数组名降级变为数组首元素地址,a+0则表示数组第一个元素的地址。同理,a+1 表示第二个元素的地址
sizeof(*a) a表示首元素地址,*a 对a进行解引用,则表示a所指向地址的内容,即首元素
sizeof(&a) &a 表示数组的地址,则&a+1 表示跳过整个数组的地址 *&a (整型的地址解引用能访问一个整型,字符的地址解引用能访问一个字符,)数组的地址解引用则访问整个数组的大小
字符数组
运行结果:
分析: char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’} 数组中只存放了a b c d e f 数组大小为6
char arr[] = “abcdef” 数组中存放了a b c d e f \0 数组大小为7
字符串:
解释:
Char *p = “abcdef”;
常量字符串放于内存的只读内存区,p中存放’a’的地址,&p为指针变量p的地址.
2.二维数组
二维数组可被看作是一种特殊的一维数组,它的元素又是一个一维数组
Eg: int a[3][4]
a可看作是一个一维数组,它有三个元素:a[0],a[1],a[2]
每个元素又是一个一维数组:
a[0] ----------- a[0][0] a[0][1] a[0][2] a[0][3]
a[1] ----------- a[1][0] a[1][2] a[1][2] a[1][3]
a[2] ----------- a[2][0] a[2][1] a[2][2] a[2][3]
现在我们来看下面的运算:
分析:
sizeof(a[0]) a[0] 第一行数组名,则sizeof(a[0]) 表示第一行大小
sizeof(a[0]+1) a[0]第一行数组名,没有单独放于sizeof()内部,则a[0]降级为首元素的地址,a[0]+1 表示第一行第二个元素
sizeof(a+1) a表示二维数组数组名,没有单独放于sizeof()内部,数组名降级为首元素地址(a[0]),a[0]+1则表示第二行地址
注:sizeof()内部表达式不参与运算
总结:
数组名代表整个数组的时候只有两种情况:
sizeof(数组名),这里的数组名表示整个数组。
&数组名,这里的数组名表示整个数组。
除此之外,所有的数组名均代表数组首元素的地址