c语言-指针笔记01

Posted acrifhy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

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

以上是关于c语言-指针笔记01的主要内容,如果未能解决你的问题,请参考以下文章

c语言-指针笔记01

c语言-指针笔记01

C语言第六天笔记2016年01月19日(周二)A.M

C语言基础学习笔记六初始指针(重点必看)(详细讲解+代码举例+练习巩固)

C语言第八天笔记2016年01月22日(周五)A.M

C语言进阶笔记深入了解进阶指针