标签: pointers

C++将指针传递给函数(Howto)+ C++指针操作

关于传递指针的工作原理,我有点困惑.

假设我有以下函数和指针,并且......

编辑:

...我想在函数中使用指向某个对象的指针作为参数.

即:

void Fun(int Pointer){
    int Fun_Ptr = ---Passed Pointer---; 
    //So that Fun_Ptr points to whatever ---Passed Pointer points to
Run Code Online (Sandbox Code Playgroud)

在*Pointer和&Pointer符号之间,我很困惑.我知道*指针意味着给它指出的任何东西.

我是否在声明中放入了void(int*pointer).我什么时候使用这个功能?

非常感谢您的协助.

编辑2:

好的,我现在明白在声明中使用*变量意味着将传递指针.但是,当我使用该功能时呢?

int main(){
    int foo;
    int *bar;
    bar = foo;
    Fun(bar);
}
Run Code Online (Sandbox Code Playgroud)

编辑3: 好的,如果我错了,请纠正我:

根据上述代码的惯例:

bar =&foo表示:使条形指向内存中的foo

*bar = foo表示将条指向的值更改为等于foo等于的值

如果我有第二个指针(int*oof),那么:

bar = oof表示:bar指向oof指针

bar =*oof表示:bar指向oof指向的值,但不指向oof指针本身

*bar =*oof表示:将条指向的值更改为oof指向的值

&bar =&oof表示:更改条指向的内存地址与oof指向的内存地址相同

我有这个权利吗?

编辑4:非常感谢你的帮助(我希望我能接受超过1个答案,但我必须选择第一个答案.我不确定社区维基是如何工作的,但我会这样离开编辑(如果您愿意,可随意将其转换为参考指南).

c++ pointers arguments function

25
推荐指数
2
解决办法
14万
查看次数

char*str ="STRING"和char str [] ="STRING"之间的区别?

在编写一个简单的函数来从字符串中删除特定字符时,我遇到了这个奇怪的问题:

void str_remove_chars( char *str, char to_remove)
{
    if(str && to_remove)
    {
       char *ptr = str;
       char *cur = str;
       while(*ptr != '\0')
       {
           if(*ptr != to_remove)
           {
               if(ptr != cur)
               {
                   cur[0] = ptr[0];
               }
               cur++;
           }
           ptr++;
       }
       cur[0] = '\0';
    }
}
int main()
{
    setbuf(stdout, NULL);
    {
        char test[] = "string test"; // stack allocation?
        printf("Test: %s\n", test);
        str_remove_chars(test, ' '); // works
        printf("After: %s\n",test);
    }
    {
        char *test = "string test";  // non-writable?
        printf("Test: %s\n", …
Run Code Online (Sandbox Code Playgroud)

c arrays string stack pointers

25
推荐指数
2
解决办法
3万
查看次数

*(指针+索引)和指针[]之间的区别

int* myPointer = new int[100];

// ...

int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];
Run Code Online (Sandbox Code Playgroud)

有没有之间的功能差异*(myPointer + index)myPointer[index]?这被认为是更好的做法?

c++ pointers

25
推荐指数
4
解决办法
5万
查看次数

是&p有效C,假设p是指向不完整类型的指针?

以下示例是C中有效的完整翻译单元吗?

struct foo;

struct foo *bar(struct foo *j)
{
    return &*j;
}
Run Code Online (Sandbox Code Playgroud)

struct foo是一个不完整的类型,但我找不到明确禁止在C标准中解除引用不完整类型.特别是,§6.5.3.2说:

一元运算&符产生其操作数的地址.如果操作数具有类型''type'',则结果具有类型''指向类型''的指针.如果操作数是一元运算*符的结果,则不会对该运算符和&运算符进行求值,结果就好像两者都被省略,除了对运算符的约束仍然适用且结果不是左值.

结果不是左值的事实不是密切相关的 - 返回值不一定是.对*运营商的限制很简单:

一元*运算符的操作数应具有指针类型.

而对于&运营商来说:

一元运算&符的操作数应该是函数指示符,[]一元或一元运算*符的结果,或者是一个左值,它指定一个不是位字段且不用register存储类说明符声明的对象.

这两个都非常满意,所以结果应该等同于return j;.

但是,gcc 4.4.5不编译此代码.它反而出现以下错误:

y.c:5: error: dereferencing pointer to incomplete type
Run Code Online (Sandbox Code Playgroud)

这是gcc的缺陷吗?

c pointers language-lawyer incomplete-type

25
推荐指数
1
解决办法
718
查看次数

不能在数组上使用.begin()或.end()

错误如下:

请求'arr'中的成员'begin','end'是非类型int [5],无法从表达式错误中推断出来.

我的代码:

#include <iostream>
using namespace std;

int main()
{
    int * mypointer;

    int arr[5] = {1,3,5,7,9};

    mypointer = arr;

    for(auto it = arr.begin(); it != arr.end(); ++it) {
        cout<<*mypointer<<endl;

        mypointer++;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers iterator c++11

25
推荐指数
2
解决办法
4万
查看次数

C:指向结构指针数组的指针(分配/释放问题)

我已经回到C中了解某些东西,但是我很难记住这种内存管理的工作原理.我想要一个指向结构指针数组的指针.

说我有:

struct Test {
   int data;
};
Run Code Online (Sandbox Code Playgroud)

那么数组:

struct Test **array1;
Run Code Online (Sandbox Code Playgroud)

它是否正确?我的问题是处理这件事.因此,数组中的每个指针都指向单独分配的内容.但我认为我需要先做到这一点:

array1 = malloc(MAX * sizeof(struct Test *));
Run Code Online (Sandbox Code Playgroud)

我无法理解上述内容.我需要这样做,为什么我需要这样做?特别是,如果我要为指针指向的每个东西分配内存,为指针分配内存意味着什么?

现在说我有一个指向结构指针数组的指针.我现在希望它指向我之前创建的相同数组.

struct Test **array2;
Run Code Online (Sandbox Code Playgroud)

我是否需要像上面那样为指针分配空间,或者我可以这样做:

array2 = array1
Run Code Online (Sandbox Code Playgroud)

c memory pointers memory-management

25
推荐指数
2
解决办法
8万
查看次数

使用指针的变量的地址

请考虑C中的以下代码

int x=100;
int*addr=&x;
Run Code Online (Sandbox Code Playgroud)

我知道addr会存储xA问题的地址,这个问题一直在我脑海中浮现,因为addr指针将有自己的地址,并且可以再次使用&符号运算符进行访问,并且它也会存储在某处,所以我们在这里有无限递归在地址上这样结束了吗?

c pointers

25
推荐指数
4
解决办法
2297
查看次数

unsigned和signed int指针之间的区别

有什么unsigned int*不同的东西吗int*?我知道unsigned有更高的价值范围.还是,int*甚至不能指向任何unsigned int

c pointers

25
推荐指数
5
解决办法
1万
查看次数

dynamic_cast的用例

在许多地方你可以读到这dynamic_cast意味着"糟糕的设计".但我找不到任何具有适当用法的文章(显示出良好的设计,而不仅仅是"如何使用").

我正在编写一个带有电路板的棋盘游戏和许多不同类型的卡,这些卡具有许多属性(一些卡可以放在板上).所以我决定将其分解为以下类/接口:

class Card {};
class BoardCard : public Card {};
class ActionCard : public Card {};
// Other types of cards - but two are enough
class Deck {
    Card* draw_card();
};
class Player {
    void add_card(Card* card);
    Card const* get_card();
};
class Board {
    void put_card(BoardCard const*);
};
Run Code Online (Sandbox Code Playgroud)

有些人建议我只使用一个描述卡片的课程.但我的意思是许多相互排斥的属性.对于Board类' put_card(BoardCard const&)- 它是接口的一部分,我不能把任何卡放在板上.如果我只有一种类型的卡,我将不得不在方法内检查它.

我看到的流程如下:

  • 一个通用的卡是在甲板上(这并不重要它的类型是什么)
  • 从牌组中抽取一张通用牌并交给一名牌手(与上述相同)
  • 如果玩家选择了BoardCard,那么它可以被放在棋盘上

所以我dynamic_cast在把卡片放在板子上之前使用.我认为在这种情况下使用一些虚拟方法是不可能的(另外我没有任何意义为每张卡添加一些关于板的操作).

所以我的问题是:我的设计是什么?我怎么能避免dynamic_cast?使用某些类型属性和ifs将是一个更好的解决方案......?

PS dynamic_cast在设计环境中处理使用的任何来源都是值得赞赏的.

c++ pointers reference

25
推荐指数
2
解决办法
1269
查看次数

C是否与C ++具有等效的std :: less?

我最近在回答一个关于p < qpq是指向不同对象/数组的指针时在C 中执行的未定义行为的问题。这让我想到:C ++ <在这种情况下具有相同(未定义)的行为,但是还提供了标准库模板std::less,该模板保证可以返回与<可以比较指针时相同的东西,并在不能比较时返回一些一致的顺序。

C是否提供具有类似功能的东西,从而可以安全地比较任意指针(相同类型)?我尝试浏览C11标准并没有发现任何东西,但是我在C中的经验比在C ++中小得多,因此我很容易错过一些东西。

c pointers memory-model undefined-behavior memory-segmentation

25
推荐指数
3
解决办法
1662
查看次数