时间:2020/2/22 18:17
目的:练习有关数组的运算
#include<stdio.h>
int main()
{
//一维数组
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(a));//16
//1.数组名单独放在sizeof内部,数组名表示整个数组,所以sizeof(数组名)计算的是是数组总大小,单位是字节
//2.&数组名,数组名表示整个数组,所以&数组名取出的是整个数组的地址
//3.除此之外,所有的数组名都表示首元素的地址
printf("%d\n", sizeof(a + 0));//4 a代表首元素地址,a+i代表第i个元素的地址,在32位平台下所有的地址的大小都是4个字节
printf("%d\n", sizeof(*a));//4 a是首元素地址,*a是首元素--1,int型占4个字节大小
printf("%d\n", sizeof(a + 1));//4 a是首元素地址,a+1是第二个元素的地址,它还是一个地址
printf("%d\n", sizeof(a[1]));//4 a[1]--第二个元素
printf("%d\n", sizeof(&a));//4 &a虽然取出的是整个数组的地址,但它还是一个地址
printf("%d\n", sizeof(*&a));//16 &a取出的是整个数组的地址,对它进行解引用,就是这个数组,这个数字的大小就是16
printf("%d\n", sizeof(&a + 1));//4 &a取出的是整个数组的地址,加1跳过了整个数组(16个字节),但它还是一个地址
printf("%d\n", sizeof(&a[0]));//4 &a[0]取的是第一个元素的地址
printf("%d\n", sizeof(&a[0] + 1));//4 &a[0] + 1取的是第二个元素的地址
return 0;
}
#include<stdio.h>
int main()
{
//字符数组
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr + 0));//4 首元素地址
printf("%d\n", sizeof(*arr));//1 首元素地址解引用是首元素(a),char类型占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));//随机值 strlen()求的是字符串长度,以'\0'为结束标志,这里并没有'\0',所以会一直往后数
printf("%d\n", strlen(arr + 0));//随机值 还是从'a'开始数,但没有'\0',所以停不下来
printf("%d\n", strlen(*arr));//程序会崩掉 strlen()接收的是一个地址,*arr是字符'a',这里把'a'的ASCII码值(97)作为一个地址访问,这一块的地址是不能被访问的
printf("%d\n", strlen(arr[1]));//错误 传的是'b',和传的是'a'效果一样
printf("%d\n", strlen(&arr));//随机值 &arr虽然取的是数组的地址,但数组的地址和数组首元素的地址是一样的,也是从‘a'开始数,但并没有'\0'
printf("%d\n", strlen(&arr + 1));//随机值 但这个随机值和前边的随机值意义不同,它是把'a','b','c','d','e','f'跳过去了,从f后边开始数
printf("%d\n", strlen(&arr[0] +1));//随机值 这个是从'b'开始往后数的
return 0;
}
#include<stdio.h>
int main()
{
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7 里边还有'\0',只不过我们看不到而已
printf("%d\n", sizeof(arr + 0));//4 arr+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 也是一个地址,不过这个地址在'\0'后边,跳过了整个数组
printf("%d\n", sizeof(&arr[0] + 1));//4 从b开始的一个地址
printf("%d\n", strlen(arr));//6 strlen()以'\0'为结束标志,但不算'\0'
printf("%d\n", strlen(arr + 0));//6 arr+0与arr都代表首元素地址
printf("%d\n", strlen(*arr));//错误 这传进来的不是一个地址,而是一个字符
printf("%d\n", strlen(arr[1]));//错误
printf("%d\n", strlen(&arr));//6 数组的地址也是首元素地址,地址的位置是一样的
printf("%d\n", strlen(&arr + 1));//随机值 跳过了'\0',从'\0'往后数,不知道会数到哪里去
printf("%d\n", strlen(&arr[0] + 1));//5 从第二个元素(b)开始往后数,遇到'\0'结束
return 0;
}
#include<stdio.h>
int main()
{
char *p = "abcdef";
printf("%d\n", sizeof(p));//4 p是指针变量,里边存的是a的地址
printf("%d\n", sizeof(p + 1));//4 还是一个地址,不过是指向了b的地址
printf("%d\n", sizeof(*p));//1 对a的地址解引用就是a
printf("%d\n", sizeof(p[0]));//1 第一个元素(a)
printf("%d\n", sizeof(&p));//4 &p取的是p的地址,p是一个指针,指向a的地址,但p的地址是什么并不知道
printf("%d\n", sizeof(&p + 1));//4 &p+1--跳过了p的一个地址
printf("%d\n", sizeof(&p[0] + 1));//4 还是一个地址,这个地址指向了b的地址
printf("%d\n", strlen(p));//6 从a开始向后数
printf("%d\n", strlen(p + 1));//5 从b开始向后数
printf("%d\n", strlen(*p));//错误 *p就是a,strlen()要的是一个地址,而不是a的ASCII码值(97)
printf("%d\n", strlen(p[0]));//错误
printf("%d\n", strlen(&p));//随机值
printf("%d\n", strlen(&p + 1));//随机值
printf("%d\n", strlen(&p[0] + 1));//5 从b开始往后数
return 0;
}
#include<stdio.h>
//二维数组
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48 整个数组有12个元素,每个元素都是int型
printf("%d\n", sizeof(a[0][0]));//4 代表的是第一行第一列那个元素
printf("%d\n", sizeof(a[0]));//16 a[0]--第一行数组名,第一行总共有4个元素
printf("%d\n", sizeof(a[0] + 1));//4 a[0]降级变为a[0][0]的地址,a[0]+1是a[0][1]的地址
printf("%d\n", sizeof(a + 1));//4 a--首元素(第一行)地址,a+1--第二行地址
printf("%d\n", sizeof(&a[0] + 1));//4 第二行地址
printf("%d\n", sizeof(*a));//16 对第一行地址解引用就是第一行元素
printf("%d\n", sizeof(a[3]));//16 这里有好多人会出错,认为这个数组并没有这么大,只有3行,不能访问第4行,其实这里并没有访问第4行,它只是一个类型(1行的大小)
return 0;
}