#include <stdio.h> int main(void) { int a; int* p; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(p)); return 0;
在上面这段代码中,用sizeof的方式显示了int和int*有占据多少字节,验证了指针变量的字节根据系统位数形成,而拿我使用的64位系统举例,输出为8
接下来我们运用p=&a进行取地址,再用p*访问地址中的内容
int main(void) { char a=0x66; char* p; p = &a; printf("%x\n", a); printf("%x\n", p); //p是取地址 printf("%x\n", *p); //前面定义了p是指向a的地址,而指针变量*p则是取地址中的内容 p++; printf("%x\n", p); return 0; }
其中p++和p--的使用,可以实现数据类型地址的加减,但是并不是单纯的加1减1,要根据数据类型的字节而定
例如:char占用一个字节,p++实现地址+1
int占用四个字节,p++实现地址+4
p--同理
数组与指针的关系
数组的等级和指针是一样的,互通的,以下面这段代码举例子
#include <stdio.h> int main(void) { char a[] = { 0x33,0x34,0x35 }; char* p; p = a; printf("p*=%x\n", *p); //输出33 printf("(p+1)*=%x\n", *(p+1));//输出34 printf("(p+2)*=%x\n", *(p + 2));//输出35 return 0; }
可以看到先声明数组a和指针*p,p=a,这里没有用p=&a是因为数组本身就是地址名,a[x]就是取地址中从0开始的第x个数,因此不需要加“&”
在使用指针和数组共通时,*p +1就是输出a数组里的下一个数而非地址。
数据传递
让我们先看普通的值传递
#include <stdio.h> void fun(int param) { printf("%x\n", param); } int main(void) { int a = 0x66; fun(a); return 0; }
接下来这段写一个用指针实现寻求数组最大值,在首行Findmax函数中用指针设立一个形参,方便接下来在主函数中把数值传递进来,一定要注重同级传递。
在这段函数中,int* array的等级相当于数组,同数组一样属于指针变量。
int Findmax(int *array,int Count) //设形参,接住主函数的数组 { int i; int max = array[0]; for (i = 1;i < Count; i++) { if (array[i] > max) //数组中比大小寻求最大值 { max = array[i]; } } return max; } int main(void) { int a[] = { 13,4,2,5,6,81 }; int Max; Max = Findmax(a, 6); printf("Max=%d\n", Max); return 0; }
标签:return,int,学习,地址,数组,printf,指针 From: https://www.cnblogs.com/ejean/p/17340832.html