C:我为什么要声明一个指针?
C: why should I declare a pointer?
似乎有很多类似“我应该申报 X 吗?”的问题。但不是这个特定的。我希望你可以问这个。
标题说明了一切:我为什么要声明一个指针?更好的是:如果我不声明指针会有风险吗?考虑以下示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <time.h>
#include <string.h>
void func(int *ptr);
int main (int argc, char **argv)
{
int a;
int *PTRa;
a = -1;
PTRa = &a;
func(PTRa);
printf("%d\n", a);
return 0;
}
void func(int *ptr)
{
*ptr = 1;
return;
}
我得到 a=1
。在这种情况下,我会说指针已声明(也已赋值):我有 int *PTRa;
行(声明)和 PTRa = &a;
行(赋值)。结果是正确的。我没有收到任何警告。
想象一下,现在将 main
替换为以下内容:
int main (int argc, char **argv)
{
int a;
a = -1;
func(&a);
printf("%d\n", a);
return 0;
}
这里我没有声明指针,只是把a
的地址给了func
。结果是正确的,我没有收到警告。
我的理解是这两种方法是相同的:func
总是得到相同的输入,a
的地址。我什至敢说我觉得第二种方法更好,因为我觉得它更清晰,而且我觉得变量 PTRa
没有用,而且有些多余。但是,我总是看到使用第一种方法的代码,而且我有一种感觉,我会被告知这样做。为什么?
在这种情况下,创建一个单独的指针变量没有任何好处。
在更复杂的情况下可能有必要,就像有时需要创建任何其他类型的变量一样。
你是对的:在你的例子中声明一个指针是没有意义的。指针只是一个保存地址的变量。更简洁的方法是直接传递变量的地址:func(&a)
而不是多做一步并声明 PTRa
.
请注意,并非所有情况都这么简单。例如,如果您想要一个 int
的数组,但您希望能够动态地增长该数组,因为您不知道它应该有多大,您必须声明一个指针:
int count = ...; // get the count from the user, from a file, etc
int *list_of_ints = malloc(sizeof(int) * count);
if (list_of_ints == NULL)
{
// malloc failed.
printf("Not enough memory!\n");
exit(1);
}
// Now `list_of_ints` has enough space to store exactly `count` `int`s
编辑:正如@paulsm4 在评论中指出的那样,问题 Why use pointers? 是与该主题相关的重要信息来源。
编辑 2:想要一个指向变量地址的指针的一个很好的理由可能是您想要一个结构或数组内部的指针:
struct foo
{
int x;
};
struct bar
{
int y;
struct foo f;
};
struct bar b;
struct foo *ptr_foo = &b.f;
您现在可以使用 b.f
更轻松地工作,因为您只是在使用 struct foo
。
看标题我以为你说的是指针类型,其实你问的是是否需要声明变量。
- 变量是一块内存,存储一些数字(字节),以及变量的类型,表示你和你的程序如何解释那些字节:整数?漂浮?特点?等等
- 指针是内存地址,可以是变量,也可以是函数,也可以是别的。
- 指针变量是内存中的一小块区域,存放着其他(甚至是同一个)内存的地址。
- 您决定是否需要一个额外的变量来存储指针。如果你想让一个变量存储一个整数,这和决定是一样的:
int v = -1;
abs(v); // use variable
abs(-1); // use constant
似乎有很多类似“我应该申报 X 吗?”的问题。但不是这个特定的。我希望你可以问这个。
标题说明了一切:我为什么要声明一个指针?更好的是:如果我不声明指针会有风险吗?考虑以下示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <time.h>
#include <string.h>
void func(int *ptr);
int main (int argc, char **argv)
{
int a;
int *PTRa;
a = -1;
PTRa = &a;
func(PTRa);
printf("%d\n", a);
return 0;
}
void func(int *ptr)
{
*ptr = 1;
return;
}
我得到 a=1
。在这种情况下,我会说指针已声明(也已赋值):我有 int *PTRa;
行(声明)和 PTRa = &a;
行(赋值)。结果是正确的。我没有收到任何警告。
想象一下,现在将 main
替换为以下内容:
int main (int argc, char **argv)
{
int a;
a = -1;
func(&a);
printf("%d\n", a);
return 0;
}
这里我没有声明指针,只是把a
的地址给了func
。结果是正确的,我没有收到警告。
我的理解是这两种方法是相同的:func
总是得到相同的输入,a
的地址。我什至敢说我觉得第二种方法更好,因为我觉得它更清晰,而且我觉得变量 PTRa
没有用,而且有些多余。但是,我总是看到使用第一种方法的代码,而且我有一种感觉,我会被告知这样做。为什么?
在这种情况下,创建一个单独的指针变量没有任何好处。
在更复杂的情况下可能有必要,就像有时需要创建任何其他类型的变量一样。
你是对的:在你的例子中声明一个指针是没有意义的。指针只是一个保存地址的变量。更简洁的方法是直接传递变量的地址:func(&a)
而不是多做一步并声明 PTRa
.
请注意,并非所有情况都这么简单。例如,如果您想要一个 int
的数组,但您希望能够动态地增长该数组,因为您不知道它应该有多大,您必须声明一个指针:
int count = ...; // get the count from the user, from a file, etc
int *list_of_ints = malloc(sizeof(int) * count);
if (list_of_ints == NULL)
{
// malloc failed.
printf("Not enough memory!\n");
exit(1);
}
// Now `list_of_ints` has enough space to store exactly `count` `int`s
编辑:正如@paulsm4 在评论中指出的那样,问题 Why use pointers? 是与该主题相关的重要信息来源。
编辑 2:想要一个指向变量地址的指针的一个很好的理由可能是您想要一个结构或数组内部的指针:
struct foo
{
int x;
};
struct bar
{
int y;
struct foo f;
};
struct bar b;
struct foo *ptr_foo = &b.f;
您现在可以使用 b.f
更轻松地工作,因为您只是在使用 struct foo
。
看标题我以为你说的是指针类型,其实你问的是是否需要声明变量。
- 变量是一块内存,存储一些数字(字节),以及变量的类型,表示你和你的程序如何解释那些字节:整数?漂浮?特点?等等
- 指针是内存地址,可以是变量,也可以是函数,也可以是别的。
- 指针变量是内存中的一小块区域,存放着其他(甚至是同一个)内存的地址。
- 您决定是否需要一个额外的变量来存储指针。如果你想让一个变量存储一个整数,这和决定是一样的:
int v = -1;
abs(v); // use variable
abs(-1); // use constant