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
    评论
C语言是一种广泛应用于计算机科学和软件开发的编程语言。它具有强大的功能和灵活性,适用于开发各种类型的应用程序。 C语言专题精讲篇是一个对C语言进行深入学习和讲解的系列文章或课程。它汇总了C语言相关的重要知识点和技巧,旨在帮助学习者更好地理解和运用C语言。 这个专题中的笔记涵盖了C语言的各个方面,包括基本语法、数据类型、运算符、流程控制、函数、数组、指针、结构体、文件操作等。通过系统性的学习和总结,这些笔记可以帮助学习者逐步掌握C语言的核心概念和常用技巧。 在这个专题中,学习者可以学到如何编写简单的C程序,如何使用变量和运算符进行计算,如何使用条件和循环语句控制程序流程,如何使用函数进行代码的模块化,如何使用数组和指针进行数据的处理,如何使用结构体组织复杂数据,如何进行文件的读写等等。 C语言专题精讲篇的目的是帮助学习者全面、深入地了解C语言的各个方面,并能够独立编写和调试简单到中等难度的C程序。通过反复实践和练习,学习者可以逐渐提高自己的编程能力,并为进一步学习更高级的编程语言打下坚实的基础。 总之,C语言专题精讲篇的笔记汇总是一份重要的学习资料,可以帮助学习者系统地学习和掌握C语言的基础知识和常用技巧,为他们未来的编程之路打下坚实的基石。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值