关于各种字符数组及指针的小研究

本文通过一系列示例详细解析了C++中指针与数组的使用方式及常见错误,帮助读者理解如何正确地使用指针来操作数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<pre name="code" class="cpp"># include <cstdio>
# include <cstdlib>
# include <ctime>
# include <cmath>
# include <iostream>
# include <fstream>
# include <cstring>
# include <string>

//*
#define local
//*/
# define maxn 10000
# define maxint 2147483647
using namespace std;

/*
ifstream fin("in.txt");
ofstream fout("out.txt");
//*/
int main()
{
	# ifdef local
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);
	#endif
	char s[2][10]={"aaa","bbb"};
	char* s1[2];
	char* s2;
	char** s3;

	//	s3=&s[0];[Error] cannot convert 'char (*)[10]' to 'char**' in assignment
	//	s3=s;[Error] cannot convert 'char [2][10]' to 'char**' in assignment
	//s3[0]=s;[Error] cannot convert 'char [2][10]' to 'char*' in assignment
	//	s1=s;[Error] incompatible types in assignment of 'char [2][10]' to 'char* [2]'
	//s1=s[0];[Error] incompatible types in assignment of 'char [10]' to 'char* [2]'
	//s1=&s;[Error] incompatible types in assignment of 'char (*)[2][10]' to 'char* [2]'
	//s1=&s[0];[Error] incompatible types in assignment of 'char (*)[10]' to 'char* [2]'
	printf("%s\n",s);//aaa
	printf("%s\n",s[0]);//aaa
	printf("%s\n",s1);//乱码,可能是s1原本存储的数据 
	//printf("%s\n",s3);编译通过,运行出错,可能是非法访问了,见下面代码
	//printf("%s\n",s1[0]);编译通过,运行出错,可能是非法访问了,见下面代码
	//printf("%s\n",s2);编译通过,运行出错,可能是非法访问了,见下面代码
	printf("\n");
	printf("%c\n",s);//0
	printf("%c\n",*s);//0
	printf("%c\n",**s);//a
	printf("%c\n",s[0]);//0
	printf("%c\n",s[0][0]);//a
	printf("%c\n",s1);//是空的  
	printf("%c\n",s1[0]);//与 printf("%s\n",s1);结果相同 
	printf("%c\n",s2);//u
	//printf("%c\n",s2[0]);编译通过,运行出错,可能是非法访问了,见下面代码
	printf("%c\n",s3);//乱码同上 
	//printf("%c\n",s3[0]);编译通过,运行出错,可能是非法访问了,见下面代码
	printf("\n");

	printf("%d\n",sizeof(s));//20
	printf("%d\n",sizeof(s[0]));//10
	printf("%d\n",sizeof(s[0][0]));//1
	printf("%d\n",sizeof(s1));//16
	printf("%d\n",sizeof(s1[0]));//8
	printf("%d\n",sizeof(s2));// 8
	printf("%d\n",sizeof(s2[0]));//1
	printf("%d\n",sizeof(s3));//8
	printf("%d\n",sizeof(s3[0]));//8
	printf("%d\n",sizeof(s3[0][0]));//1
	printf("\n");

	printf("%p\n",&s);   //00000000009ffe30
	printf("%p\n",s);    //00000000009ffe30
	printf("%p\n",s[0]); //00000000009ffe30
	printf("%p\n",&s[0]);//00000000009ffe30

	printf("%p\n",&s1);//00000000009ffe20
	printf("%p\n",s1);//00000000009ffe20
	printf("%p\n",&s1[0]);//00000000009ffe20
	printf("%p\n",s1[0]);//0000000000000001

	printf("%p\n",&s2);//00000000009ffe18
	printf("%p\n",s2);//000000000040ea05
	printf("%p\n",&s2[0]);//000000000040ea05
	printf("%p\n",s2[0]);//00000000ffffff83

	printf("%p\n",&s3);//00000000009ffe10
	printf("%p\n",s3);//ffffffffffffffff
	printf("%p\n",&s3[0]);//ffffffffffffffff
	//printf("%p\n",s3[0]);//0
	//printf("%p\n",&s3[0][0]);//000000000040ea05
	//printf("%p\n",s3[0][0]);//0

	s1[0]=s[0];
	s2=s[0];
	//s3[0]=s[0];//程序崩溃 
	//s3[0]=s1[0];//程序崩溃 
	s3=s1;
	printf("after s1[0]=s[0];\n");
	printf("%p\n",&s1);//00000000009ffe20
	printf("%p\n",s1);//00000000009ffe20
	printf("%p\n",&s1[0]);//00000000009ffe20
	printf("%p\n",s1[0]);//00000000009ffe30

	printf("%p\n",&s2);//00000000009ffe18
	printf("%p\n",s2);//00000000009ffe30
	printf("%p\n",&s2[0]);//00000000009ffe30	
	printf("%p\n",s2[0]);//0000000000000061

	printf("%p\n",&s3);//00000000009ffe10
	printf("%p\n",s3);//00000000009ffe20
	printf("%p\n",&s3[0]);//00000000009ffe20
	printf("%p\n",s3[0]);//00000000009ffe30
	printf("%p\n",&s3[0][0]);//00000000009ffe30
	printf("%p\n",s3[0][0]);//0000000000000061
	return 0;
 } 



总结明天写吧。。。

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值