相关疑难解决方法(0)

为什么要使用指针?

我知道这是一个非常基本的问题,但是我在用高级语言编写一些项目之后开始使用一些基本的C++编程.

基本上我有三个问题:

  1. 为什么使用指针超过正常变量?
  2. 我应该何时何地使用指针?
  3. 你如何使用指针与数组?

c c++ pointers

344
推荐指数
14
解决办法
23万
查看次数

C中的指针:何时使用&符号和星号?

我刚开始用指针,我有点困惑.我知道&一个变量的地址,它*可以在指针变量前面使用,以获取指针指向的对象的值.但是当您使用数组,字符串或使用变量的指针副本调用函数时,情况会有所不同.在所有这些内部很难看到逻辑模式.

什么时候应该使用&*

c pointers

272
推荐指数
8
解决办法
19万
查看次数

指针与参考

在给函数提供原始变量时,最好的做法是:

unsigned long x = 4;

void func1(unsigned long& val) {
     val = 5;            
}
func1(x);
Run Code Online (Sandbox Code Playgroud)

要么:

void func2(unsigned long* val) {
     *val = 5;
}
func2(&x);
Run Code Online (Sandbox Code Playgroud)

IOW:有没有理由选择一个而不是另一个?

c++ variables pointers reference

249
推荐指数
7
解决办法
11万
查看次数

指向指针的指针如何在C中工作?

如何指针指针在C中工作?你什么时候使用它们?

c

164
推荐指数
11
解决办法
12万
查看次数

如何向初学者解释C指针(声明与一元运算符)?

我最近很高兴向C编程初学者解释指针并偶然发现了以下困难.如果你已经知道如何使用指针,它可能看起来似乎不是一个问题,但尝试以清醒的头脑看下面的例子:

int foo = 1;
int *bar = &foo;
printf("%p\n", (void *)&foo);
printf("%i\n", *bar);
Run Code Online (Sandbox Code Playgroud)

对于绝对的初学者来说,输出可能会令人惊讶.在第2行他/她刚刚宣布*bar为&foo,但在第4行结果显示*bar实际上是foo而不是&foo!

您可能会说,混淆源于*符号的模糊性:在第2行中,它用于声明指针.在第4行中,它用作一元运算符,它获取指针指向的值.两件不同的事,对吗?

然而,这种"解释"根本不能帮助初学者.它通过指出一个微妙的差异引入了一个新的概念.这不是教授它的正确方法.

那么,Kernighan和Ritchie是如何解释的呢?

一元运算符*是间接或解除引用运算符; 当应用于指针时,它访问指针指向的对象.[...]

指针ip的声明int *ip用作助记符; 它说表达式*ip是一个int.变量声明的语法模仿可能出现变量的表达式的语法.

int *ip应该读作" *ip会回来int"吗?但是为什么声明后的作业不遵循这种模式?如果初学者想要初始化变量怎么办?int *ip = 1(阅读:*ip将返回a intintis 1)将无法按预期工作.概念模型似乎并不一致.我在这里错过了什么吗?


编辑:它试图在这里总结答案.

c pointers

138
推荐指数
13
解决办法
8862
查看次数

是否有任何平台指向不同类型的指针有不同的大小?

C标准允许指向不同类型的指针具有不同的大小,例如sizeof(char*) != sizeof(int*)是允许的.但是,它确实要求如果指针转换为a void*然后转换回其原始类型,则必须将其与原始值进行比较.因此,从逻辑上讲,sizeof(void*) >= sizeof(T*)对于所有类型T,正确吗?

在当今使用的大多数常见平台上(x86,PPC,ARM和64位变体等),所有指针的大小都等于本机寄存器大小(4或8字节),而不管指向的类型.是否存在任何深奥或嵌入式平台,其中指向不同类型的指针可能具有不同的大小?我特别询问数据指针,虽然我也有兴趣知道是否存在函数指针具有异常大小的平台.

我绝对不会问C++的指向成员的指针和指向成员的指针函数.这些在常见平台上具有不寻常的大小,甚至可以在一个平台内变化,具体取决于指针类的属性(非多态,单继承,多继承,虚继承或不完整类型).

c pointers sizeof

57
推荐指数
7
解决办法
4909
查看次数

内存管理,堆腐败和C++

所以,我需要一些帮助.我正在用C++开发一个项目.但是,我想我已经设法破坏了我的堆.这是基于我std::string向一个类添加了一个并从另一个类中赋值的事实std::string:

std::string hello = "Hello, world.\n";
/* exampleString = "Hello, world.\n" would work fine. */
exampleString = hello;
Run Code Online (Sandbox Code Playgroud)

使用堆栈转储在我的系统上崩溃.所以基本上我需要停下来查看我的所有代码和内存管理内容,找出我搞砸了的地方.代码库仍然很小(约1000行),因此这很容易实现.

不过,我对这种东西感到头疼,所以我想我会把它扔出去.我在一个Linux系统上并且已经四处乱窜valgrind,虽然我不知道我在做什么,但它确实报告说它std::string的析构函数是无效的.我不得不承认从谷歌搜索中获得"堆腐败"一词; 关于这类东西的任何通用文章也将受到赞赏.

(之前rm -rf ProjectDir,在C#再做一次:D)

编辑:我还没有说清楚,但我要求的是诊断这些记忆问题的建议.我知道std :: string的内容是正确的,所以这是我做过的事情(或者是一个bug,但是选择不是问题).我确信我可以查看我编写的代码,你很聪明的人会立即看到问题,但我想将这种代码分析添加到我的'工具箱'中,就像它一样.

c++ memory heap stack

18
推荐指数
3
解决办法
1万
查看次数

避免指针问题的最佳实践

与指针有关的程序员错误的实际结果是什么?

当程序员创建指针错误时会发生什么"不良影响"?

带代码的实际例子是优选的.

c pointers

18
推荐指数
2
解决办法
4449
查看次数

从Java角度看C指针和数组的教程

我现在是大学新生,主修CS.我刚刚完成了我的"计算机程序设计入门"课程.我喜欢它,觉得我学到了很多东西.

几天前,我读了乔尔的"Java学校的危险"."链接列表?" 我想,"那些甚至都不是很难.我们已经完成了一些已经上课的人." 这是正确的,因为在Java中,它们并不那么难.但无论如何,我试着用C语言写一个.

它太难了!

Joel是对的,我认为...... Java为你处理了许多小小的东西,它真的不那么难.但我决心克服我学校的Java-tude并学习如何在C中写下这个dang链表.

所以我想,有人问,有没有人知道学习C的好(和免费)在线教程,而不是试图提出很多很小的问题?具体来说,学习如何处理指针,以及所有那些符号(&,*,**,[]以及它们如何协同工作),我想,认为我已经在Java中很精通,所以我不需要对如何写教程一个"你好,世界!" 程序.但是我绝对不准备进入任何超级高级的C或C++,因为我所知道的只是Java.

任何帮助赞赏!

c java arrays pointers

14
推荐指数
1
解决办法
646
查看次数

指针有什么意义?

当我可以声明变量时,C++中的指针有什么意义?什么时候适合使用它们?

c++ pointers

13
推荐指数
2
解决办法
1906
查看次数

标签 统计

pointers ×8

c ×7

c++ ×4

arrays ×1

heap ×1

java ×1

memory ×1

reference ×1

sizeof ×1

stack ×1

variables ×1