数组的练习



Sizeof与Strlen的区别:

1.sizeof是运算符,strlen是函数。

2.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小;sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。

下面看一写运算:

1.一维数组

#include<stdio.h>
#include<windows.h>
int main()
{
	int a[] = { 1, 2, 3, 4 };
	printf("%d\n", sizeof(a));//整个数组的大小                      16
	printf("%d\n", sizeof(a + 0));//首元素的地址,&a[0]的大小;       4
	printf("%d\n", sizeof(*a));//第一个元素,a[0],则占空间为4byte; 4
	printf("%d\n", sizeof(a + 1));//数组下一元素的地址,&a[1]的大小;4
	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));//下一个数组的首地址;*(a+1)的大小 4
	printf("%d\n", sizeof(&a[0]));//a[0]的地址;                      4 
	printf("%d\n", sizeof(&a[0] + 1));//a[1]的地址;                  4
	system("pause");
	return 0;
}

2,字符数组

char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
		printf("%d\n", sizeof(arr));//整个数组的大小                      6
		printf("%d\n", sizeof(arr + 0));//首元素的地址,&arr[0]的大小;       4
		printf("%d\n", sizeof(*arr));//第一个元素,arr[0];                 1
		printf("%d\n", sizeof(arr + 1));//数组下一元素的地址,&arr[1]的大小;4
		printf("%d\n", sizeof(arr[1]));//第二个元素;                       1
		printf("%d\n", sizeof(&arr));//数组的地址,即指针的大小;          4
		printf("%d\n", sizeof(*&arr));//*(数组地址)                        6 
		printf("%d\n", sizeof(&arr + 1));//下一个数组的首地址;*(arr+1)的大小 4
		printf("%d\n", sizeof(&arr[0]));//arr[0]的地址;                      4 
		printf("%d\n", sizeof(&arr[0] + 1));//arr[1]的地址;                  4
		system("pause");
		return 0;

int main()
{
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", strlen(arr));//arr的长度,strlen以\0结束,但strlen不包括\0。长度是随机值19
	printf("%d\n", strlen(arr + 0));//首元素地址;  随机值19;
	printf("%d\n", strlen(&arr[0]));//首元素地址19
	//printf("%d\n", strlen(*arr));//“const char *”与“char”(arr的类型)的间接级别不同,不匹配;    
	//printf("%d\n", strlen(arr[1]));//“const char *”与“char”的间接级别不同
	printf("%d\n", strlen(&arr));//“const char *”与“char (*)[6]”的间接级别不同,有警告;数组的地址在数值上等于首元素相同;19
	printf("%d\n", strlen(*&arr));//*(数组的地址);   19
	printf("%d\n", strlen(&arr + 1));//“const char *”与“char (*)[6]”的间接级别不同 strlen(arr)-6=13
	printf("%d\n", strlen(&arr[0] + 1));//下一个元素地址strlen(arr)-1=18
	printf("%d\n", strlen(arr + 1));//下一个元素地址;18  
	system("pause");
	return 0;
}

注意:strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。

char arr[] = {"abcdef" };
	printf("%d\n", sizeof(arr));//整个数组的大小                      7
	printf("%d\n", sizeof(arr + 0));//首元素的地址,&arr[0]的大小;     4
	printf("%d\n", sizeof(*arr));//第一个元素,arr[0];                1
	printf("%d\n", sizeof(arr[1]));//第二个元素;                       1
	printf("%d\n", sizeof(arr + 1));//数组下一元素的地址,&arr[1]的大小;4
	printf("%d\n", sizeof(&arr));//数组的地址,即指针的大小;          4
	printf("%d\n", sizeof(*&arr));//*(数组地址)                       7
	printf("%d\n", sizeof(&arr + 1));//下一个数组的首地址;*(arr+1)的大小 4
	printf("%d\n", sizeof(&arr[0]));//arr[0]的地址;                    4
	printf("%d\n", sizeof(&arr[0] + 1));//arr[1]的地址;                 4
	system("pause");
	return 0;

char arr[] = { "abcdef" };
		printf("%d\n", strlen(arr)); //arr的长度,strlen以\0结束,但strlen不包括\0。 6
		printf("%d\n", strlen(arr + 0));//首元素地址;     6                          
		printf("%d\n", strlen(&arr[0]));//首元素地址       6
		//printf("%d\n", strlen(*arr)) ;//首元素,“const char *”与“char”(arr的类型)的间接级别不同,不匹配;    
		//printf("%d\n", strlen(arr[1]));//“const char *”与“char”的间接级别不同
		printf("%d\n", strlen(&arr));//“const char *”与“char (*)[6]”的间接级别不同,有警告;数组的地址在数值上等于首元素相同;6
		printf("%d\n", strlen(*&arr));//*(数组的地址);   6
		printf("%d\n", strlen(&arr + 1));//“const char *”与“char (*)[6]”的间接级别不同 ,下一个数组的地址;随机值
		printf("%d\n", strlen(&arr[0] + 1));//下一个元素地址strlen(arr)-1=5
		printf("%d\n", strlen(arr + 1));//下一个元素地址;  5
		system("pause");
		return 0;

 
 

int main()
{
	char *p = "abcdef";
	printf("%d\n", sizeof(p));//指针变量; 4
	printf("%d\n", sizeof(p+1));//指针加1就是加上所指类型的大小; 4
	printf("%d\n", sizeof(*p));//首元素;1
	printf("%d\n", sizeof(p[0]));//&a[0];1
	printf("%d\n", sizeof(&p));//指针变量的地址;4
	printf("%d\n", sizeof(&p+1));//&p是二级指针,char**;4
	printf("%d\n", sizeof(&p[0]+1));// 4


	printf("%d\n", strlen(p));//指针变量;6
	printf("%d\n", strlen(p + 1));//       5
	//printf("%d\n", strlen(*p));//首元素;“const char *”与“char”的间接级别不同;
	//printf("%d\n", strlen(p[0]));//&a[0]=arr,“const char *”与“char ”的间接级别不同;
	printf("%d\n", strlen(&p));//指针变量的地址,“const char *”与“char **”的间接级别不同; 随机值 3
	printf("%d\n", strlen(&p + 1));//&p是二级指针,char**,“const char *”与“char **”的间接级别不同; 随机值  11
	printf("%d\n", strlen(&p[0] + 1));// 5
	system("pause");
	return 0;
}

3.二维数组

	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//整个数组的大小;  12*4=48
	printf("%d\n", sizeof(a[0]));//首元素的大小——首数组的大小;16
	printf("%d\n", sizeof(a[0][0]));//首数组的首元素大小;      4
	printf("%d\n", sizeof(a[0]+1));//下一个元素a[0][1];         4
	printf("%d\n", sizeof(a+1));//&a[1],第二个元素的地址——第二个数组的地址  4
	printf("%d\n", sizeof(&a[0]+1));//下一个元素的地址——下一个数组的地址;(数组指针)  4
	printf("%d\n", sizeof(*a));//a[0];   16
	printf("%d\n", sizeof(a[3]));//虽然下标不存在(不允许写入),允许访问  16









猜你喜欢

转载自blog.csdn.net/snowyuuu/article/details/80017576