【刷题】指针和数组

目录

1.一维数组

2.字符数组(1)

 3.字符数组(2)

4. 字符数组(3)

 5.二维数组


1.一维数组

#include<stdio.h>
#include<string.h>

int main()
{
	//一维数组

	int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));//16 计算a数组的字节数
	printf("%d\n", sizeof(a + 0));//4\8 a+0表示a[0]的地址,计算地址字节数
	printf("%d\n", sizeof(*a));//4 *a表示对数组a首地址解引用,得到数组a[0]的内容,计算a[0]的字节数
	printf("%d\n", sizeof(a + 1));//4\8 a+1表示a[1]的地址,计算地址字节数
	printf("%d\n", sizeof(a[1]));//4 计算a[1]的字节数
	printf("%d\n", sizeof(&a));//4\8 &a表示整个数组a的地址,计算地址字节数
	printf("%d\n", sizeof(*&a));//16 *&a表示对数组a的地址进行解引用,得到整个数组的内容,计算整个数组a内容的字节数,4*4=16
	printf("%d\n", sizeof(&a + 1));//4\8 &a+1表示对整个数组a地址加1的跨度,跨度的大小取决于目标的类型,目标为类型为int [4],因此跨度为4*4=16,计算目标为a[3]后4个字节的地址,计算地址字节
	printf("%d\n", sizeof(&a[0]));//4\8 计算a[0]的地址
	printf("%d\n", sizeof(&a[0] + 1));//4\8 &a[0]+1表示对a[0]地址加1的int字节数,得到a[1]的地址,计算地址字节
    return 0;
}

验证:

 

2.字符数组(1)

#include<stdio.h>
#include<string.h>

int main()
{
    //字符数组

	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", sizeof(arr));//6 sizeof(arr)表示计算arr整个数组的字节数
	printf("%d\n", sizeof(arr + 0));//4\8 arr+0 表示arr数组首地址加0,得到a[0]的地址,计算地址字节数
	printf("%d\n", sizeof(*arr));//1 *arr表示对arr数组首地址解引用,得到a[0]的内容,计算a[0]的字节数
	printf("%d\n", sizeof(arr[1]));//1 计算arr[1]的字节数
	printf("%d\n", sizeof(&arr));//4\8 &arr表示取arr整个数组的地址,计算地址字节数
	printf("%d\n", sizeof(&arr + 1));//4\8 &arr+1表示对arr整个数组的地址加1个int [6]类型的字节数,int [6]的字节数为1*6=6,可以理解为跨过arr数组后的地址,计算地址字节数
	printf("%d\n", sizeof(&arr[0] + 1));//4\8 &arr[0]+1表示对arr[0]取地址,再加上1个int类型的字节数,得到a[1]的地址,计算地址字节数

	printf("%d\n", strlen(arr));//随机数  传入arr首地址,计算从传入地址到'\0'之间的字符数
	printf("%d\n", strlen(arr + 0));//随机数  arr+0表示数组arr的首地址加0字节,计算从arr[0]到'\0'之间的字符数
	printf("%d\n", strlen(&arr));//随机值 传入arr整个数组的地址,计算从a[0]地址到'\0'之间的字符数
	printf("%d\n", strlen(&arr + 1));//随机值 &arr+1表示在arr整个数组之后的地址(arr[5]地址加char类型的字节数),计算从传入地址到'\0'之间的字符数
	printf("%d\n", strlen(&arr[0] + 1));//随机值  &arr[0]+1表示在取arr[0]的地址加1个char类型的字节数,得到a[1]的地址,计算地址字节数
	printf("%d\n", strlen(*arr));//错误代码  *arr表示对arr数组首地址进行解引用,得到a[0]的内容,'a'对应ASCII码表数值97,将97作为地址传入,非法访问地址
	printf("%d\n", strlen(arr[1]));//错误代码  将arr[1]的内容'b’(对应ASCII码表中的数值98)作为地址传入,非法访问地址

    return 0;
}

验证:

 

 

 3.字符数组(2)

#include<stdio.h>
#include<string.h>

int main()
{
    //字符数组

	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//7 计算arr整个数组的字节数,7*1=7('abcdef\0'),注意整个arr数组包括结尾的'\0'
	printf("%d\n", sizeof(arr + 0));//4\8 arr+0表示arr首地址(arr[0]的地址)加0字节,计算a[0]地址字节数
	printf("%d\n", sizeof(*arr));//1 *arr表示对arr首地址解引用,得到arr[0],计算arr[0]的字节数
	printf("%d\n", sizeof(arr[1]));//1 计算arr[1]的字节数
	printf("%d\n", sizeof(&arr));//4\8 计算arr整个数组地址的字节数(与arr[0]地址一样)
	printf("%d\n", sizeof(&arr + 1));//4\8 &arr+1表示对取arr整个数组的地址,加1个char [7]类型的字节数(1*7=7),计算地址字节数
	printf("%d\n", sizeof(&arr[0] + 1));//4\8 对arr[0]取地址,加1个char类型的字节数,得到arr[1]的地址,计算地址字节数

	printf("%d\n", strlen(arr));//6  传入arr数组首地址(arr[0]的地址),计算arr[0]地址到'\0'之间的字符数
	printf("%d\n", strlen(arr + 0));//6  arr+0表示arr[0]地址加0字节,计算arr[0]地址到'\0'之间的字符数
	printf("%d\n", strlen(&arr));//6  &arr表示取arr整个数组的地址(与arr[0]地址一样),计算arr[0]地址到'\0'之间的字符数
	printf("%d\n", strlen(&arr + 1));//随机值  &arr+1表示对取arr整个数组的地址,加1个char [7]类型的字节数(1*7=7),计算arr数组的'\0'的后一位字符到下一个'\0'之间的字符数
	printf("%d\n", strlen(&arr[0] + 1));//5  &arr[0]+1表示对arr[0]取地址,加1个char类型的字节数,得到arr[1]的地址,计算arr[1]到'\0'之间的字符数
	printf("%d\n", strlen(*arr));//错误代码  对arr首地址解引用,得到arr[0]的内容'a'('a'对应ASCII码表数值97),将97作为地址传入,非法访问地址
	printf("%d\n", strlen(arr[1]));//错误代码  arr[1]的内容'b'('b'对应ASCII码表数值98),将98作为地址传入,非法访问地址

    return 0;
}

验证:

 

 

 

4. 字符数组(3)

#include<stdio.h>
#include<string.h>

int main()
{
    //字符数组

	char* p = "abcdef";
	printf("%d\n", sizeof(p));//4\8  计算指针p指向地址的字节数 计算地址的字节数
	printf("%d\n", sizeof(p + 1));//4\8  p+1表示指针p指向地址,加1个char类型的字节数,得到"abcdef"中"b"的地址,计算地址的字节数
	printf("%d\n", sizeof(*p)); //1  *p表示对指针p指向地址进行解引用,得到"a",计算"a"的字节数
	printf("%d\n", sizeof(p[0]));//1  计算"a"的字节数
	printf("%d\n", sizeof(&p));//4\8  &p表示取p指针的地址,计算地址的字节数
	printf("%d\n", sizeof(&p + 1));//4\8  &p+1表示对取p指针的地址,加1个char类型的字节数,计算地址的字节数
	printf("%d\n", sizeof(&p[0] + 1));//4\8  &p[0]+1表示对取"a"的地址,加1个char类型的字节数(数组中的"b"的地址),计算地址的字节数


	printf("%d\n", strlen(p));//6 传入指针p指向的地址,计算从字符数组"a"开始到"\0"之间的字符数
	printf("%d\n", strlen(p + 1));//5 传入指针p指向的地址,加1个char类型字节数,计算从字符数组"b"开始到"\0"之间的字符数
	printf("%d\n", strlen(&p));//随机值  &p表示取指针p的地址,计算从指针p的地址开始到"\0"之间的字符数
	printf("%d\n", strlen(&p + 1));//随机值  &p+1表示取指针p的地址,加1个char类型的字节数,计算从指针p后一字节的地址开始到"\0"之间的字符数
	printf("%d\n", strlen(&p[0] + 1));//5 &p[0]+1表示对p[0]取地址(取字符数组中"a"的地址),加一个char类型的字节数,计算从字符数组"b"开始到"\0"之间的字符数
	printf("%d\n", strlen(*p));//错误代码  *p表示对p指针解引用,得到内容'a'('a'对应ASCII码表数值97),将97作为地址传入,非法访问地址
	printf("%d\n", strlen(p[0]));//错误代码 p[0]的内容为'a'('a'对应ASCII码表数值97),将97作为地址传入,非法访问地址

    return 0;
}

验证:

 

 

 

 5.二维数组

#include<stdio.h>
#include<string.h>

int main()
{
	//二维数组

	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48  计算整个数组a中的字节数,(3*4)*4 = 48
	printf("%d\n", sizeof(a[0][0]));//4  计算a[0][0]的字节数
	printf("%d\n", sizeof(a[0]));//16  计算a[0]行的字节数,4*4 = 16
	printf("%d\n", sizeof(a[0] + 1));//4\8  a[0]+1表示在a[0]的首地址加1个int类型字节数,计算a[0][1]地址的字节数
	printf("%d\n", sizeof(*(a[0] + 1)));//4 *(a[0]+1)表示对a[1]进行解引用,得到a[1][0],计算a[1][0]的字节数
	printf("%d\n", sizeof(a + 1));//4\8  a+1表示取a的首地址(第一行的地址),加1行就是数组a第二行的地址
	printf("%d\n", sizeof(*(a + 1)));//16  *(a + 1)表示对数组a第二行地址解引用,得到第二行的内容,计算数组a第二行的字节数
	printf("%d\n", sizeof(&a[0] + 1));//4\8  &a[0]+1表示取a[0]整行的地址,加1就是取a[1]整行的地址,计算地址的字节数
	printf("%d\n", sizeof(*(&a[0] + 1)));//16  *(&a[0] + 1)就是对a[1]整行的地址解引用,得到a[1]整行的内容,计算数组a第二行的字节数
	printf("%d\n", sizeof(*a));//16  *a表示对数组a的首行解引用,得到a[0]整行的内容,计算数组a第一行的字节数
	printf("%d\n", sizeof(a[3]));//16  计算a[3]行的字节数,4*4 = 16


    return 0;
}

验证:

 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值