#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));//这是基址变址寻址方式,指针存放基址,开辟另一个寄存器存放变址,因此指针的值是不变的。
形参与实参传值及存在寿命
形参本没有被分配内存,函数调用时,实参的副本传给形参,实参的母本不变。在调用函数过程中,打印出来的是实时的形参的值。而在调用函数结束后,形参被分配的内存空间被释放,再打印就是实参原来的值。代码中有实验部分。