指针和数组笔试题解析

sizeof单目运算符---->求数组在内存中所占空间的大小(’\0’即使隐藏,大小也算)

如果不对数组定义空间大小的话,系统会根据里面的内容自动分配大小
若果去掉分配大小8,5的话,
此时系统为他们分配的大小为3,4(因为c只有c风格字符串后面系统默认加上’\0’)

strlen函数---->求c风格字符串的长度(’\0’大小不算在里面)
计算数组大小时,若里面不是字符串,
在末尾都要加上**’\0’,作为结束标志**,若果非字符串数组(常量数字,字符)没加’\0’,就会一直找’\0’,
中间会打印许多未定义字符,形成**“烫烫烫**”,直到找到’\0’

&arr+1 代表跨过整个数组
&arr[0]+1 代表指向数组第一个元素

strlen 函数不能对单个字符求大小

	char name[] = { 'a', 'v', "无"};
	printf("%d\n",strlen(name));//4
	printf("%d\n", sizeof(name));//5
	//1	表明" "系统会自己添加'\0'作为结尾标志
	//2	字母一个字节,汉字两个字节
	//3	strlen函数求得是字符串的长度,即所占字节数多少
	//	sizeof运算符算的是这个数组在内存中所占空间的大小

一维数组

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a[] = { 1, 2, 3, 4 };
	printf("%d\n", sizeof(a));			//16
	//对数组名求所占内存大小,就是求整个数组在内存中所占空间的大小
	printf("%d\n", sizeof(a+0));		//4
	//数组名本身不能加减数字,此时隐式退化成指针就能进行加减操作
	// 32位操作系统下,一个指针占4个字节
	printf("%d\n", sizeof(*a));			//4
	//要对它进行解引用,说明它隐式退化成指向数组首元素的指针
	printf("%d\n", sizeof(a+1));		//4
	//指针才能进行加减操作
	printf("%d\n", sizeof(a[1]));		//4
	//求一个int型所占字节的大小
	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
	//指针加减数字也是指针,占4个字节
	system("pause");
	return 0;
}

字符数组–>也是个数组,可通过下标取值

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{				
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(arr));		//6
	//sizeof运算符是求目标在内存中所占空间的大小,若有\0结尾,结果就是7
	printf("%d\n", sizeof(arr+0));		//4
	//指针才能进行加减运算
	printf("%d\n", sizeof(*arr));		//1
	//指针才能解引用,得到字符,一个字符占用一个字节
	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
	//指针加减还是指针
	printf("%d\n", strlen(arr));		//随机数(求数组里字符长度)
	printf("%d\n", strlen(arr+0));		//(求指针指向的数组字符长度)
	printf("%d\n", strlen(&arr));		//(求指针指向的数组字符长度)
	//上面三个都是
	//strlen是一个函数求c风格字符串长度,这个数组里没有以\0结尾,所以
	//它就会一直找\0,直到随缘出现为止,
	//若此处有'\0',strlen(&arr+1)就为5,从第一个数b开始计数
	printf("%d\n", strlen(&arr + 1));
	//数组指针+1,会跳过这个数组,跳到外界去,随机值
	printf("%d\n", strlen(&arr[0] + 1));
	//指针+1,会从b开始算,但找不到\0,所以取随机值,否则就是数组长度-1
	//printf("%d\n", strlen(*arr));		//
	//printf("%d\n", strlen(arr[1]));		//
	//上面这两个求单个字符的长度,此处不应进行strlen操作
	printf("------------------------\n");


	char* p = "abcdef";
	//p存的地址是数组首元素的地址,即&a
	printf("%d\n", sizeof(p));		//4
	//p是指针类型的变量
	printf("%d\n", sizeof(p+1));	//4
	//指针相加减还是指针
	printf("%d\n", sizeof(*p));		//1
	//解引用得到a,a占一个字节
	printf("%d\n", sizeof(p[0]));	//1
	//p[0]即取值为a,数组第0个元素
	printf("%d\n", sizeof(&p));		//4
	//二级指针本质上也是一级指针,占4个字节
	printf("%d\n", sizeof(&p+1));	//4
	printf("%d\n", sizeof(&p[0]+1));//4
	
	printf("%d\n", strlen(p));		//6
	//strlen以'\0'结尾,但并不将它计数
	printf("%d\n", strlen(p+1));	//5
	//指针+1也就是从b开始计数,有5个数
	//printf("%d\n", strlen(*p));		//
	//printf("%d\n", strlen(p[0]));	//
	//不能对一个字符使用strlen函数
	printf("%d\n", strlen(&p));		//随机值
	printf("%d\n", strlen(&p+1));	//随机值
	//上面两个都是取随机值,第一个是个二级指针,指向的不是这个字符数组
	//第二个是二级指针+1指向的不是这个字符数组
	printf("%d\n", strlen(&p[0]+1));//5
	//取p[0]的地址,+1得到&p[1],从这开始算字符串长度为5
	system("pause");
	return 0;
}

二维数组

以a[3][2]为例

a[0]是指向a[0][0]地址的指针,a[0]也就是a[0][0] a [0][1] a[0][2]的数组名

&a							int ***
a							int **
&a[0]						int *
a[0]						int *
&a[0][0]					int *
a[0][0]						int
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int a[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
	printf("%d\n", sizeof(a));			//48
	//二维数组在内存中是这样排列的1,2,3,4, 5,6,7,8, 9,10,11,12
	//每个元素占4个字节4*12=48
	printf("%d\n", sizeof(a[0][0]));	//4
	//数组第0行第0列的元素1,是int型
	printf("%d\n", sizeof(a[0]));		//16
	//a[0]={1,2,3,4}有4个int型元素
	printf("%d\n", sizeof(a[0]+1));		//4
	//指针才能进行加减,一个指针4个字节
	printf("%d\n", *(a[0] + 1));		//值为2
	printf("%d\n", sizeof(*(a[0]+1)));	//4
	//参考上面
	printf("------------\n");
	printf("%d\n", sizeof(a+1));		//4
	//数组隐式退化成指针
	printf("%d\n", sizeof(*(a+1)));		//16
	//a+1即a[1]={5,6,7,8}
	printf("%d\n", sizeof(&a[0]+1));	//4
	//指针
	printf("%d\n", sizeof(*(&a[0]+1)));	//16
	//a[1]={5,6,7,8}
	printf("%d\n", sizeof(*a));			//16
	//a[0]={1,2,3,4}
	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值