数组和指针结合易混淆的点

本文详细探讨了C语言中一维和二维数组与指针之间的关系,包括数组大小的计算、指针运算以及内存拷贝函数`memcpy`和`memmove`的使用。通过示例代码,解释了指针在数组操作中的作用,如地址计算、元素访问和内存拷贝等基本概念。
摘要由CSDN通过智能技术生成

一维数组和指针结合        int     a[ ]={ 1,2,3,4 };

    printf("%d\n",sizeof(a));		//这个数组的大小 4元素*4字节 =16字节
 
    printf("%d\n",sizeof(a + 0));	//(a+0)代表是一个地址,我们0号元素的地址 是4/8字节 

    printf("%d\n",sizeof(*a));		//*a是取元素0的内容, 元素内容占用空间int 是4 字节

    printf("%d\n",sizeof(a + 1));	//(a + 1) 代表一个地址,我们1号元素的地址 是4/8 字节

    printf("%d\n",sizeof(a[1]));	//a[1]下标法取内容, 元素内容占用空间int 是4字节

    printf("%d\n",sizeof(&a));		//&a代表一个地址, 是4/8 字节
	printf("%#p\n",a);				//a数组名是地址,指向数组首地址 
	printf("%#p\n",&a); 结果相同	//&a 取数组名地址,也是地址,它是指向整行数组
 
    printf("%d\n",sizeof(*&a)); 	//1.*&a<==>a  2.sizeof(a); 计算整个数组大小4*4=16字节
 
    printf("%d\n",sizeof(&a + 1));	//1. &a拿到整行地址,2. 移动到下一行。本质还是地址
    printf("%d\n",sizeof(&a[0]));	//1. a[0], 2.&a[0] 对元素取地址,结果是0号元素地址 
    printf("%d\n",sizeof(&a[0] + 1)); //1.&a[0] 2.往下移动一次。 结果是1号元素地址 

二维数组和指针结合    int  a[3][4] = { 0 };

	int a[3][4] = { 0 }; 
	printf("%d\n", sizeof(a));      //计算数组空间=3*4*4=48 字节

	printf("%d\n", sizeof(a[0][0]));  //计算元素a[0][0]空间大小是int型4字节 

	printf("%d\n",sizeof(a[0]));  //a[0]行地址, 1行*4元素*4字节=16字节   等同于*(a+0)

	printf("%d\n",sizeof(a[0] + 0)); //a[0]行地址,加0就指定了列地址,4/8字节

	printf("%d\n",sizeof(a[0] + 1)); //a[0]+1指向本行的下一元素,也就是列地址 4/8字节
 
	printf("%d\n",sizeof(*(a[0] + 1))); //计算a[0][1]元素所占空间  等同于 *(*(a+0)+1)  

	printf("%d\n",sizeof(a + 1));//a+1是指向下一行地址,本质是地址 4/8 

    printf("%#p\n",a);			//a指向首地址 ,代码具体地址 
	printf("%#p\n",*a+1);		//a+1,指向下一行 ,拿到的是具体地址 
								//二维数组的数组名,移动一下,相当于移动一行 
	
	printf("%d\n",sizeof(*(a + 1)));// *(a+1) 拿到了行地址 计算行地址内的空间 
	
	printf("%#p\n",a[0]); 			 // a[0]代表行的起始地址,
	printf("%d\n",sizeof(&a[0] + 1));// a[0]代表行起始地址,&a[0]<==>a 转换为行地址 ,移 
                                         动一下,实际移动整行,实际是a[1] 
	
	printf("%d\n",sizeof(*(&a[0] + 1)));		//*(a+1)取整行内容的占用空间 
	printf("%d\n",sizeof(*a));					//*(a)取整行内容的占用空间 

	printf("%d\n",sizeof(a[3]));      //行的起始地址  4/8
				
 

    memcpy(arr1,arr2,8 ) 从数组2拷贝八个字节内容到数组1,或者数组内部拷贝

    int a_04[10]={-1,-2,-3,-4,-5,-6,-7,-8,-9,-10};
	print(a_04,10);
	//拷贝元素0 、1 到元素 8 、9的位置
	//结果:int a_04[10]={-1,-2,3,4,5,6,7,-1,-2} 
	//memcpy(&a_04[8],&a_04[0],8);
	//利用memcpy函数,实现同一数组内,内容的拷贝,不交叉 

memmove (arr[0],arr[2],12) 从数组第三个元素往后数12字节内容移动到第0元素

    int a_04[10]={-1,-2,-3,-4,-5,-6,-7,-8,-9,-10};
    拷贝元素0 、1 、2到元素 1 、2 、3的位置   往后拷贝 
	结果:int a_04[10]={-1,-1,-2,-3,-5,-6,-7,-8,-9,-10} 
	memmove(a_04+1,a_04,12);
	print(a_04,10);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值