c语言-指针笔记01

c语言-指针笔记01

在这里插入图片描述

C中的地址

如果程序中有变量var,则&var将在内存中提供其地址。

在使用scanf()函数时,我们已多次使用地址。

scanf("%d", &var);

这里用户输入的值存储在var变量的地址中。 让我们举一个可行的例子。

#include <stdio.h>
int main()
{
  int var = 5;
  printf("var: %d\n", var);

  // Notice the use of & before var
  printf("address of var: %p", &var);  
  return 0;
}

输出:

var: 5 
address of var: 2686778

注意:运行上面的代码时,您可能会获得其他地址(根据计算机的不同)。

C指针

指针(指针变量)是用于存储地址而不是值的特殊变量。

指针语法

声明指针的方法:

int* p;

在这里,我们声明了一个int类型的指针p。

您也可以通过以下方式声明指针:

int *p1;
int * p2;

让我们再举一个声明指针的例子:

int* p1, p2;

在这里,我们声明了一个指针p1和一个普通变量p2。

给指针分配地址

让我们举个例子:

int* pc, c;
c = 5;
pc = &c;

这里将5分配给int变量c。 并将c的地址分配给指针pc。

获取指针指向的变量的值:

使用*运算符。 例如:

int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc);   // Output: 5

在这里我们使用了* pc获取了c的值。

注意:在上面的示例中,pc是一个指针,而不是* pc。 您不能也不应做类似* pc =&c;的操作。

顺便说一句,*被称为取消引用运算符(使用指针时)。 它对指针进行操作,并给出存储在该指针中的值。

改变指针指向的值

让我们举个例子:

int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c);    // Output: 1
printf("%d", *pc);  // Ouptut: 1

我们已经将c的地址分配给了pc指针。

然后,将c的值更改为1。由于pc和c的地址相同,因此* pc返回1。

让我们再举一个例子:

int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc);  // Ouptut: 1
printf("%d", c);    // Output: 1

我们已经将c的地址分配给了pc指针。

然后,我们使用* pc = 1;将* pc更改为1。 由于pc和c的地址相同,因此c等于1。

让我们再举一个例子:

int* pc, c, d;
c = 5;
d = -15;

pc = &c; printf("%d", *pc); // Output: 5
pc = &d; printf("%d", *pc); // Ouptut: -15

最初,使用pc =&c;将c的地址分配给pc指针。 由于c为5,* pc返回5。

然后,使用pc =&d;将d的地址分配给pc指针。 由于d为-15,因此* pc返回-15。

让我们来举一个例子看看指针是怎么工作的:

#include <stdio.h>
int main()
{
   int* pc, c;
   
   c = 22;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c);  // 22
   
   pc = &c;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 22
   
   c = 11;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 11
   
   *pc = 2;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c); // 2
   return 0;
}

输出:

Address of c: 0061FEC8
Value of c: 22

Address of pointer pc: 0061FEC8
Content of pointer pc: 22

Address of pointer pc: 0061FEC8
Content of pointer pc: 11

Address of c: 0061FEC8
Value of c: 2

程序说明:

int* pc, c;

在这里插入图片描述

在这里,创建了一个指针pc和一个类型为int的普通变量c。
由于pc和c最初并未初始化,因此指针pc指向无地址或随机地址。 并且,变量c有一个地址,但包含随机垃圾值。

c = 22;

在这里插入图片描述

这里将22分配给变量c。 也就是说,将22存储在变量c的存储位置中。

pc = &c;

在这里插入图片描述

这里将变量c的地址分配给指针pc。

c = 11;

在这里插入图片描述

这里将11分配给变量c。

*pc = 2;

在这里插入图片描述

这会将指针pc指向的内存位置的值更改为2。

使用指针时的常见错误

假如您希望指针pc指向c的地址。 然后,

int c, *pc;

// pc is address but c is not
pc = c; // Error

// &c is address but *pc is not
*pc = &c; // Error

// both &c and pc are addresses
pc = &c;

// both c and *pc values 
*pc = c;

这是指针语法初学者经常会感到困惑的示例:

#include <stdio.h>
int main() {
   int c = 5;
   int *p = &c;

   printf("%d", *p);  // 5
   return 0; 
}

为什么在使用int * p =&c;时没有收到错误消息?

这是因为:

int *p = &c;

等同于:

int *p:
p = &c;

在这两种情况下,我们都将创建一个指针p(不是* p)并将&c分配给它。

为了避免这种混乱,我们可以使用如下语句:

int* p = &c;

文章来自公众号:内卡巴拉之树
在这里插入图片描述
欢迎关注

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值