我最近在C中使用了函数指针.
继续回答你自己的问题的传统,我决定对那些需要快速深入研究这个主题的人进行一些基本的总结.
对于C或C++中的许多新的,甚至是老的大学生来说,为什么指针会成为混乱的主要因素?是否有任何工具或思维过程可以帮助您理解指针在变量,函数和更高级别的工作方式?
有什么好的做法可以让人达到"啊哈,我明白了"的水平,而不会让他们陷入整体概念的困境?基本上,钻取方案.
我刚开始用指针,我有点困惑.我知道&一个变量的地址,它*可以在指针变量前面使用,以获取指针指向的对象的值.但是当您使用数组,字符串或使用变量的指针副本调用函数时,情况会有所不同.在所有这些内部很难看到逻辑模式.
什么时候应该使用&和*?
我有一个程序读取游戏中实体的"原始"列表,我打算创建一个数组,其中包含一个不确定数量的实体的索引号(int),用于处理各种事物.我想避免使用太多的内存或CPU来保存这些索引......
到目前为止,我使用的一个快速而肮脏的解决方案是在主处理函数(本地焦点)中声明具有最大游戏实体大小的数组,以及另一个整数来跟踪已添加到列表中的数量.这并不令人满意,因为每个列表都拥有3000多个阵列,这并不是那么多,但感觉就像是浪费,因为我可以使用6-7列表的解决方案来实现不同的功能.
我没有找到任何C(不是C++或C#)特定的解决方案来实现这一目标.我可以使用指针,但我有点害怕使用它们(除非它是唯一可能的方式).
数组不会离开本地函数作用域(它们将被传递给函数,然后被丢弃),以防更改内容.
如果指针是唯一的解决方案,我如何跟踪它们以避免泄漏?
我在互联网上阅读不同的东西并感到困惑,因为每个网站都说不同的东西.
谈到C.
我读到了*引用运算符&和解引用运算符; 或者引用意味着使指针指向变量,并且解除引用正在访问指针指向的变量的值.所以我很困惑.
我是否可以获得有关"引用和取消引用"的简单但彻底的解释?
我是C的新手,具有良好的java背景,我正在尝试理解指针和数组.
我知道下标operator[]是数组定义的一部分,所以:
int numbers[] = {1,3,4,5};
Run Code Online (Sandbox Code Playgroud)
会创建一个整数数组,它将在内存中表示为16个字节,4个4个字节:
numbers[0] = 1, address 0061FF1C
numbers[1] = 3, address 0061FF20
numbers[2] = 4, address 0061FF24
numbers[3] = 5, address 0061FF28
Run Code Online (Sandbox Code Playgroud)
但是,当涉及指针时,我的知识开始崩溃,所以如果我要创建一个指向数组数字的指针,我将执行以下操作:
int *pNumbers = &numbers[0];
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
而且我猜它的大小是4字节?
然而,**我读作"指针指针"对我来说没有意义,为什么有人想要指针指针,当然如果a-> b-> c然后a-> c就足够了?我知道我错过了一些东西,它必须与数组有关,argv可以是类型char[ ]或char **下面看到的:
int main(int argc, char **argv){}
Run Code Online (Sandbox Code Playgroud)
所以:
**)?我在一些不同的函数中有一些代码看起来像这样:
void someFunction (int *data) {
data = (int *) malloc (sizeof (data));
}
void useData (int *data) {
printf ("%p", data);
}
int main () {
int *data = NULL;
someFunction (data);
useData (data);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
someFunction ()并useData ()在单独的模块(*.c文件)中定义.
问题是,虽然malloc工作正常,并且分配的内存可用someFunction,但一旦函数返回,相同的内存就不可用.
这里可以看到程序的示例运行,输出显示各种存储器地址.
有人可以向我解释我在这里做错了什么,以及如何让这段代码工作?
编辑:所以似乎我需要使用双指针来做这个 - 当我真的需要使用双指针时,我将如何做同样的事情?所以例如数据就是
int **data = NULL; //used for 2D array
Run Code Online (Sandbox Code Playgroud)
那么我是否需要在函数调用中使用三指针?
它只是发生在我身上我不知道如何使用C++中的一个语句初始化指向非指针值的指针:
int a = 1;
int** ppa = &&a; //Does not compile
int** ppa = &(&a); //Does not compile
int* pa = &a; //Works but is a
int** ppa = &pa; //Two step solution
Run Code Online (Sandbox Code Playgroud)
我错过了什么,是两个声明唯一的方法吗?
可能重复:
指向指针的指针如何在C中工作?
你好,
尽管我认为我在编程中通过了新手阶段,但仍然有一些问题,我不知道怎么解释它们.是的,有很多"如何"超越,但几乎总是没有人解释为什么和/或何时有一种技术有用.
在我的例子中,我发现在某些情况下,在C++中使用指向指针的指针.不是指向对象的指针吗?哪些好处?应该在何处或何时使用指向指针的指针?在这件事上我觉得有点失常.
我希望时间经验丰富的专家可以回应这些担忧,希望其他没有经验丰富的程序员可以分享.;-)
谢谢大家.
Julen.
所以...假设我有这样的功能...
int function( const char *c )
{
//do something with the char *c here...
}
Run Code Online (Sandbox Code Playgroud)
这是什么char *c意思?我认为我一般了解字符,但我不明白 * 的作用......或者它如何改变含义。