你所不知道的指针

C语言基础知识

1.指针

指针:指针是一个特殊的变量,它里面存放的是一个地址。
指针4要素:
1.指针的类型

//只要把指针声明语句里的指针名字去掉,剩下的就是该指针的类型
int *p;       //指针的类型是int*
char *p;      //指针的类型是char*
int **p;      //指针的类型是int**
int (*p)[3]   //指针的类型是int(*)[3]
int *(*p)[4]; //指针的类型是int*(*)[4]

2.指针所指向的类型

int *p;       //指针所指向的类型是int
char *p;      //指针所指向的类型是char
int **p;      //指针所指向的类型是int
int (*p)[3]   //指针所指向的类型是int()[3]
int *(*p)[4]; //指针所指向的类型是int*()[4]

3.指针的值(指针所指向的内存区或地址)
4.指针本身所占据的内存区(指针本身所占的内存大小)

  • 所谓指针,就是内存的地址,所谓指针变量,也就是保存了内存地址的变量。指针的大小在32位平台是4个字节,在64位平台是8个字节
    对于32位系统,程序能够使用的最大内存是4G,
    最小的地址是0x0000 0000
    最大得地址是0xFFFF FFFF

    在指针定义中*是与变量名结合的
int main()
{
	int *p,s;        //p是整型指针变量,s是整型变量
	char *cpa, *cpb; //cpa和cpb都是char类型指针变量
	int a = 10;
	int *ip;         //未初始化的指针,野指针
	ip = &a;         //与int *p = &a 等价
	return 0; 
}
  • 使用指针变量首先要明确指针变量自身的值(存储的是地址),在明确指针变量所指向的实体(解引用)
//传地址,x,y交换可以使主函数中的a,b的值发生交换
void Swap(int *x,int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);
printf("a=%d b=%d\n",a,b);
return 0;
}
  • 定义指针变量时,类型对指针变量起两个作用
    (1)解析存储单元的大小
    (2)指针变量加1的能力(指针P+1=指针P + sizeof(指针的类型* 1)
    指针和整型加减后的结果仍然是指针类型
//赋值(=)优先级>*和++,*和++是自右向左结合
int main()
{
int ar[5] = {12,23,34,45,56};
int *p = ar;//等价于int*p = &ar[0]指针变量p指向数组首元素地址
int x = 0;
int y = 0;
x = *p++;//先执行x = *p;x的值就是12 再执行*p++;
//指向数组第二个元素23的地址
y = *p;//数组第二个元素的地址解引用,y的值就是23
printf("%d %dn\n",x,y);//12,23
x = ++*p;//先*p;解引用就是23,然后++23,赋给x,所以x的值是24
//这时候数组的第二个元素就变成了24
y = *p;//对数组第二个元素解引用,y的值就是24
printf("%d %dn\n",x,y);//24,24
x = *++p;//先执行++p;指针p指向数组第三个元素34的地址
//然后*p,解引用,x的值就是34
y = *p//34
printf("%d %dn\n",x,y);/34,34 
return 0;
}
  • 指针的应用:我们可以用一个指针和一个循环来遍历一个数组
int main()
{
    const int n = 10;
    int array[n] = { 0 };
    int* ptr = array;
    for (int i = 0; i < n; i++)
    {
       printf("0x%p => %d\n",ptr, *ptr);//遍历地址和地址里面存的值
        (*ptr)++;
        ptr++;
    }
    printf("\n");
    return 0;
}
  • 关于*和&
int  a = 10;
int *p = &a;//p 等价于 &a,*p 等于 a本身
*&a => *(&a)//先取变量a的地址,等价于p,
//然后在取a地址上的数据,等价于*p,就是a本身
&*p => &*p)//先取所指地址上的数据,等价于a,
//然后在取a的地址,等价于&a
*&p => //先取p本身的地址,再对p的地址解引用,等价于p本身
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值