C语⾔中有关⼀维数组的⼀些运算
在学习C语⾔⼀维数组有关计算中,有关sizeof和strlen的的计算我们必须掌握!
⼀、sizeof
有两种情况出现时,在运算中代表整个数组:
(1)当数组名arr单独放在sizeof()内部时,即:sizeof(arr);单位字节
(2)当数组名arr单独放在&后⾯时,即:&a;
除以上两种情况外,其余情况都代表数组⾸元素的地址。
⼆、strlen
strlen()⽤于计算指定字符串的长度,它会从数组⾸元素的地址开始⼀直下去,直⾄遇到结束字符“\0”时停⽌,在计算长度时不包括"\0"。
下⾯我们通过以下例⼦来掌握此类计算(其中 整型int ⼤⼩为四个字节,字符型char ⼤⼩为⼀个字节):
例⼀:
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4 };// 4个元素
printf("%d\n", sizeof(arr));//16 数组名单独放在sizeof内部时表⽰整个数组
printf("%d\n", sizeof(arr+0));//4 数组⾸元素的地址加0,仍然代表数组⾸元素的地址
printf("%d\n", sizeof(*arr));//4 数组⾸元素的⼤⼩
printf("%d\n", sizeof(arr+1));//4 数组⾸元素地址加1,表⽰数组第⼆个元素的地址
printf("%d\n", sizeof(arr[1]));//4 数组第⼆个元素的⼤⼩
printf("%d\n", sizeof(&arr));//4 数组⾸元素的⼤⼩
printf("%d\n", sizeof(*&arr));//16 数组指针解引⽤来管理整个数组的⼤⼩,此处相当于sizeof(arr)
printf("%d\n", sizeof(&arr+1));//4 跳过整个数组arr之后的数组地址⼤⼩
printf("%d\n", sizeof(&arr[0]));//4 数组⾸元素的地址
printf("%d\n", sizeof(&arr[0]+1));//4 数组第⼆个元素的地址
return 0;
}
例⼆:
#include<stdio.h>
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };// 6个元素(该数组⽆'\0')
printf("%d\n", sizeof(arr));//6 整个数组的⼤⼩
printf("%d\n", sizeof(arr+0));//4 数组⾸元素地址加0,仍表⽰数组⾸元素的⼤⼩
printf("%d\n", sizeof(*arr));//1 数组名代表数组⾸元素的地址,数组⾸元素的地址解引⽤,代表数组⾸元素的⼤⼩
printf("%d\n", sizeof(arr[1]));//1 第⼆个元素的⼤⼩
printf("%d\n", sizeof(&arr));//4 数组⾸元素的⼤⼩
printf("%d\n", sizeof(&arr+1));//4 跳过整个数组之后的下⼀个元素⼤⼩指向f的后⾯
printf("%d\n", sizeof(&arr[0]+1));//4 第⼆个元素的地址
printf("%d\n", strlen(arr));//随机值由于该数组⽆'\0'
printf("%d\n", strlen(arr+0));//随机值数组⾸元素加0,表⽰从数组第⼀个元素开始
printf("%d\n", strlen(*arr));//X *arr表⽰数组⾸元素,即'a',也就是从地址为97开始,但由于97是⼀个未知的地址,不允许访问,程序会报错
printf("%d\n", strlen(arr[1]));//X 本题和上题出现了同样的错误,从'b'之后开始,程序会报错
printf("%d\n", strlen(&arr));//随机值从数组⾸元素开始⼀直下去
printf("%d\n", strlen(&arr+1));//随机值跳过整个数组开始,⼀直下去,和上题相差6
printf("%d\n", strlen(&arr[0]+1));//随机值数组第⼆个元素b的地址开始,⼀直下去
return 0;
}
例三:
#include<stdio.h>
int main()
{
char arr[] = "abcdef";//7个元素(该数组有'\0')
printf("%d\n", sizeof(arr));//7 整个数组
printf("%d\n", sizeof(arr+0));//4 数组名代表数组⾸元素的地址,加0仍然是数组⾸元素的地址
printf("%d\n", sizeof(*arr));//1 数组名代表数组⾸元素的地址,数组⾸元素的地址解引⽤代表数组⾸元素
sizeof 指针printf("%d\n", sizeof(arr[1]));//1 数组第⼆个元素b
printf("%d\n", sizeof(&arr));//4 数组⾸元素的地址
printf("%d\n", sizeof(&arr+1));//4 跳过整个数组后的下⼀个元素地址
printf("%d\n", sizeof(&arr[0]+1));//4 数组第⼆个元素b的地址
printf("%d\n", strlen(arr));//6 整个数组元素个数,遇'\0'停⽌,不计算'\0'
printf("%d\n", strlen(arr+0));//6 从数组第⼀个元素开始
printf("%d\n", strlen(*arr));//X *arr表⽰数组⾸元素,即'a',也就是从地址为97开始,但由于97是⼀个未知的地址,不允许访问,程序会报错 printf("%d\n", strlen(arr[1]));//X 本题和上题出现了同样的错
误,从'b'之后开始,程序会报错
printf("%d\n", strlen(&arr));//6 从数组⾸元素开始,遇'\0'停⽌
printf("%d\n", strlen(&arr+1));//随机值跳过整个数组后,到数组结束的个数
printf("%d\n", strlen(&arr[0]+1));//5 从数组第⼆个元素开始,到数组结束的个数
return 0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论