C语言之指针

本文详细探讨了C语言中的指针,包括内存编址、指针变量、引用与解引用、二级指针、指针数组、堆上的内存操作以及const在指针中的应用。讲解了如何通过指针间接访问数据、改变一级指针的指向以及如何处理指针的输入与输出。
摘要由CSDN通过智能技术生成

(二)指针篇

一,内存编址与变量地址

这里写图片描述

变量的地址为所占连续内存中最低位的地址。
&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)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值