一句话学懂指针——C指针详解

文章详细介绍了C语言中的指针概念,包括指针变量存储地址、*运算符的使用、数组与指针的关系以及指针在函数参数中的应用。通过示例代码展示了指针的赋值、解引用和指针计算,解释了指针作为左值和右值的情况,并探讨了数组名作为指针的特性。
摘要由CSDN通过智能技术生成

指针

首先我们来引入最重要的一句话来引出指针;*p p中存放的谁的地址,*p就是谁

#include <stdio.h>
int main()
{
	//指针变量是用来存放地址的
	int a = 10;
	int* p = &a;
	*p = 100;	//*p = a,p中存放的是a的地址,所以*p就是a
	printf("a = %d\n",a);	//a = 100;
	return 0;
}

运算符&

  • 获取变量的地址,它的操作数必须是变量
  • 地址的大小是否与int相同取决于编译器是32位还是64位
  • &不能对没有地址的东西取地址
&(a+b)	//×
&(a++)	//×
&(++a)	//×

指针变量

  • 变量的是内存的地址

    • 普通变量的值是实际的值
    • 指针变量的值是具有实际值的变量的地址
  • *是一个单目运算符,用来访问指针的值所表示的地址上的变量

  • *可以作为右值也可以作为左值

int a = *p;
*p = a + 1;

与文章开头所描述的是一样的
那么传入函数的数组成了什么?

  • 函数参数表中的数组实际上就是指针
    • sizeof(a) == sizeof(int*)
    • 但是可以用数组的运算符[]进行运算
  • 以下四种函数原型是等价的
int sum(int *a,int n);
int sum(int *,int);
int sum(int a[],int n);
int sum(int [],int n);
  • 数组变量本身表达地址,所以
    • int a[5]; int* p = a;就不需要取地址符&了
    • 但是数组的单元表达的是变量,需要用&取地址 a == &a[0]
  • []运算符可以对数组做,也可以对指针做
    • p[0] <==>a[0]
  • 运算符可以对数组做,也可以对指针做
    • *a = 25
  • 数组变量是const的指针,所以不能被赋值
    • int b [] -->int * const b;
    • int b[] = a;(×)

指针计算

(一)

#include <stdio.h>

int main()
{
	int a = 1;
	int b = 2;
	int* pa = &a;
	int* pb = pa;
	*pb = 3;
	b = 4;
	printf("a = %d\n", a);	//3
	printf("b = %d\n", b);	//4
	printf("*pa = %d\n", *pa);	//3
	printf("*pb = %d\n", *pb);	//3
	pb = &b;
	*pb = a;
	a = 5;
	printf("a = %d\n", a);	//5
	printf("b = %d\n", b);	//3
	printf("*pa = %d\n", *pa);	//5
	printf("*pb = %d\n", *pb);	//3
	*pb = *pa;
	*pb = 6;
	printf("a = %d\n", a);	//5
	printf("b = %d\n", b);	//6
	printf("*pa = %d\n", *pa);	//5
	printf("*pb = %d\n", *pb);	//6
	return 0;
}

(二)

#include <stdio.h>

int main()
{
	int a = 1;
	int b = 2;
	int* pa = &a;
	int* pb = pa;
	*pb = &b;
	pb = &b;
	printf("a = %d\n", a);	//&b
	printf("b = %d\n", b);	//2
	printf("*pa = %d\n", *pa);	//&b
	printf("*pb = %d\n", *pb);	//2
	b = 5;
	*pa = b;
	pb = b;
	printf("a = %d\n", a);	//5
	printf("b = %d\n", b);	//5
	printf("*pa = %d\n", *pa);	//5
	printf("*pb = %d\n", *pb);	//崩溃	异常
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晶小生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值