(二)指针篇
一,内存编址与变量地址
变量的地址为所占连续内存中最低位的地址。
&a == 0xffff fffa
&b == 0x0000 ffd1
&c == 0x0000 0010
二,指针与指针变量
1,指针的本质
指针
实质就是一个有类型的地址
int a=0x12345678;
printf("&a=%p\n",&a);
//0x0060feac
printf("*&a=%x\n",*&a);
//12345678
pritnf("*&a=%x\n",*((int *)0x0060feac));
//12345678
由此,可得:&a == (int *)0x0060feac
所以说,指针就是有类型的地址。
2,指针变量
内存的地址,为指针常量。而存放内存地址的变量为指针变量。
指针变量的3个条件:
- 大小为4B(32位机器)
- 有类型:决定了以p存放的地址为起始地址的寻址大小。
- 区别于其他变量
int a=0x12345678;
printf("%p\n",(char *)&a);
//78
printf("%p\n",(short *)&a);
//5678
printf("%p\n",(int *)&a);
//12345678
3,引用与解引用
int arr[5];
arr == &arr[0]
//p
arr+1 == &arr[1]
//p+4B
&arr
//p
&arr+1
//p+20B
*(&arr)
//arr[0]
*(&arr+1)
//arr[6]
int a[10];
printf("&a[9]-&a[4]=%d\n",&a[9]-&a[4]);
//5
printf("(int)&a[9]-(int)&a[4]=%d\n",(int)&a[9]-(int)&a[4]);
//20
三,二级指针
二级指针是一种指向一级指针的指针。利用二级指针可以实现:
- 间接访问数据
- 改变一级指针的指向问题
1,改变一级指针的指向
int a=10,b=20;
int *ps=&a;
int **pps=&ps;
printf("*ps=%d\n",*ps);
//ps=&a,*ps=10
*pps=&b;
printf("*ps=%d\n",*ps);
//ps=&b,*ps=20
由此,可以推出N级指针
可以改变N-1级指针
的指向
。
2,初始化一级指针
#include<stdio.h>
enum
{
Success,NameErr,SexErr,NumErr,ScoreErr
};
struct Stu
{
char *name;
char *sex;
char *num;
float *score;
};
`/*这种初始化方式最大的好处就是能返回多种多样的返回值,我们`
可以掌握很多程序的执行返回信息.*/`
int init(struct Stu **pp)
{
*pp=(struct Stu *)malloc(sizeof(struct Stu));
if(*pp==NULL)
return -1;
(*pp)->name=(char *)malloc(100);
if((*pp)->name==NULL)