有关数组sizeof和strlen的运算

1.数组名单独放在sizeof()内部,数组名表示整个数组。

  sizeof(数组名)表示计算整个数组的大小,单位为字节。

2.&数组名 数组名表示整个数组。

 &数组名 表示取出整个数组的地址

3.除此之外,数组名都表示首元素的地址

4.*为解除引用操作符

5.strlen是一个函数,为求字符串长度,以\0为结束标志,若字符里面没有遇到\0产生的是一个随机值。sizeof是一个取字节的运算符。

6.指针的意义

1)指针加数字走多远与指针类型有关.int类型跳过4个字节,char类型逃过1个字节。

2)用指针时访问的权限有多大。

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

int main()
{
	//一维数组
	void test_1();
	{
		int a[] = { 1, 2, 3, 4 };
		printf("%d\n", sizeof(a));// 16整个数组的地址
		printf("%d\n", sizeof(a + 0));//4  首元素的地址
		printf("%d\n", sizeof(a + 1));// 4第二个元素的地址
		printf("%d\n", sizeof(*a));// 4首元素地址
		//*a = *(a+0) = a{0}
		//*arr[i] == *(arr+i)
		printf("%d\n", sizeof(a[1]));//4 第二个元素的地址
		printf("%d\n", sizeof(&a));//4 数组的地址
		printf("%d\n", sizeof(*&a));//16 整个数组的地址
		printf("%d\n", sizeof(&a + 1));//4 逃过整个数组
		printf("%d\n", sizeof(&a[0]));//4 首元素地址
		printf("%d\n", sizeof(&a[0] + 1));// 4 第二个元素的地址
	}
	//字符数组
	void test_2(); 
	{
		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 首元素大小
		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));//随机值
		//printf("%d\n", strlen(*arr));// error
		//printf("%d\n", strlen(arr[1]));//error
		//*arr和arr[1]找的是a和b的ascll码值,但这里面找不到
		printf("%d\n", strlen(&arr));//随机值
		printf("%d\n", strlen(&arr + 1));//随机值  
		printf("%d\n", strlen(arr[0] + 1));//随机值
	}

	void test_3();
	{
		char arr[] = "abcdef";
		printf("%d\n", sizeof(arr));//7 求字节长度
		printf("%d\n", sizeof(arr + 0));//4 求首元素地址
		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 表示第二个元素的地址

		printf("%d\n", strlen(arr));// 6 求字符串长度
		printf("%d\n", strlen(arr + 0));// 6 同上
		printf("%d\n", strlen(*arr));// error  相当于strlen('a'),非法访问地址
		printf("%d\n", strlen(&arr));// 6 表示求数组arr的字节长度
		printf("%d\n", strlen(&arr + 1));// 随机值 逃过整个数组,指向\0的后边
		printf("%d\n", strlen(&arr[0] + 1));// 5 表示从第二个元素向后数,求字节长度
	}

	void test_4();
	{
		char *p = "abcdef";
		printf("%d\n", sizeof(p));// 4表示指针变量
		printf("%d\n", sizeof(p + 1));// 4 表示b的地址
		printf("%d\n", sizeof(*p));// 1  *为接触应用操作符, 表示a
		printf("%d\n", sizeof(p[0]));// 1 p[0]表示a,求字节长度
		printf("%d\n", sizeof(&p));//  4 表示求指针变量的地址
		printf("%d\n", sizeof(&p + 1));//4  表示指向*p的后边
		printf("%d\n", sizeof(&p[0] + 1));//4  b的地址

		printf("%d\n", strlen(p));//6 求字符串长度
		printf("%d\n", strlen(p + 1));//5  从b开始向后数字符个数
		printf("%d\n", strlen(*p));// error  *为解除应用操作符  相当于strlen('a'),非法访问地址
		printf("%d\n", strlen(p[0]));//error   相当于strlrn('a'),非法访问地址
		printf("%d\n", strlen(&p));//随机值 对p取地址得到二级指针
		printf("%d\n", strlen(&p + 1));//随机值  同上
		printf("%d\n", strlen(p[0] + 1));//5 p[0]为第一个元素,p[0]+1为第二个元素,表示从第二个元素向后数
	}
	//二维数组
	void test_5();
	{
		int  a[3][4] = { 0 };
		printf("%d\n", sizeof(a));//48 表示整个数组的字节长度
		printf("%d\n", sizeof(a[0][0]));//4 表示首元素的字节长度
		printf("%d\n", sizeof(a[0]));// 16 表示第一行的字节长度
		printf("%d\n", sizeof(a[0] + 1));//  4  表示第二行第一个数
		printf("%d\n", sizeof(a + 1));// 4 表示数组的第二行
		printf("%d\n", sizeof(*a));// 16 表示第一行的地址
		printf("%d\n", sizeof(a[3]));//16 a[3]会转化为a[0],
		//因为sizeof()里的表达式不参与运算,而且sizeof()是在编译期间处理的,他会进行数据推断
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40955824/article/details/79961877