指针取值数组

#include<stdio.h>

int main(){
	int one[] = {0, 1, 2, 3, 4};
	int rows = sizeof(one)/sizeof(one[0]);//求数组长度的方式,数组总体占内存量除以单个元素占内存量,
	                                      // 因此int rows = sizeof(one)/sizeof(int)这样也是正确的 
	//printf("%d", sizeof(char));
    //	int *ptr = &one[5]; 这种数组地址赋值给指针的方式是错误的,赋值赋的是数组第六项的地址 
    int *ptr = &one[0];//int *ptr = one这样赋值也是正确的,都是把数组的第一个元素的地址赋给指针。 
	printf("%d\n", rows);
	printf("k\n");
	void print1(int *ptr, int rows);
	print1(ptr, rows);
	printf("%8u", ptr);//这里打印的是实参指针中的值,该函数调用完毕之后会自动释放形参的内存空间,此时打印出来的是没有任何改变的实参的值 
	return 0;
}

void print1(int *ptr, int rows){
	for(int i = 0; i < rows; i++)
		printf("%8u%5d\n", ++ptr, *(ptr));//这种写法也是正确的,每次更改指针的指向,指针存的地址是不断改变的。 但是注意取值时不是*(ptr++),因为指针已经更改到位了 
	//	printf("%8u%5d\n", ptr + i, *(ptr + i));//这是基址变址寻址方式,指针存放基址,开辟另一个寄存器存放变址,因此指针的值是不变的。 
	printf("%8u", ptr);//这里打印的是形参指针的值,该函数调用完毕之后会自动释放形参的内存空间 。形参是实参的一个副本,因此改变副本的值不回影响母本的值。 
	printf("\n");
}

sizeof()求普通数字数组长度

int one[]={0, 1, 2, 3, 4};
int length = sizeof(one)/sizeof(one[0])=sizeof(one)/sizeof(int)

赋数组的地址给指针

*int *ptr = &one[0];或者int ptr = one
实际上one 就相当于 &one[0] 取one数组的头地址

指针取值方式

1.把指针放到寄存器里,每次改变指针的值来取值,取完值之后指针的值是变的,指向数组最后一个元素。
for(int i = 0; i < rows; i++)
printf("%8u%5d\n", ptr++, (ptr));//每次更改指针的指向,指针存的地址是不断改变的。 但是注意取值时不是(ptr++),因为指针已经更改到位了

2.把指针放到基址寄存器里,每次依靠变址寄存器来取值,那么取完值之后原指针的值是不变的
printf("%8u%5d\n", ptr + i, (ptr + i));//这是基址变址寻址方式,指针存放基址,开辟另一个寄存器存放变址,因此指针的值是不变的。

形参与实参传值及存在寿命

形参本没有被分配内存,函数调用时,实参的副本传给形参,实参的母本不变。在调用函数过程中,打印出来的是实时的形参的值。而在调用函数结束后,形参被分配的内存空间被释放,再打印就是实参原来的值。代码中有实验部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值