标签: pointers

无法为变量和指针赋值

可能重复:
分段尝试在C中打印值时出错

我对C很新,但不知道为什么这个程序会破坏.如果我删除了与之相关的行,程序将编译并运行i,但如果我分配i,我不能再分配任何东西*ptr而不打破程序.

int main(void)
{
    int i;
    int *ptr;

    i = 2;
    *ptr = 5;
    printf("%d",*ptr);
}
Run Code Online (Sandbox Code Playgroud)

c pointers

13
推荐指数
1
解决办法
4万
查看次数

func(int&param)和func(int*param)之间有什么区别?

在下面的代码,都amp_swap()star_swap()似乎是在做同样的事情.那么为什么有人喜欢使用一个而不是另一个呢?哪一个是首选符号,为什么?或者只是品味问题?

#include <iostream>

using namespace std;

void amp_swap(int &x, int &y)
{
    int temp = x;
    x = y;
    y = temp;
}

void star_swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main()
{
    int a = 10, b = 20;
    cout << "Using amp_swap(): " << endl;
    amp_swap(a, b);
    cout << "a = " << a << ", b = " << b << endl;
    cout …
Run Code Online (Sandbox Code Playgroud)

c++ pointers reference

12
推荐指数
1
解决办法
1315
查看次数

ptr->你好();/*VERSUS*/(*ptr).hello();

我正在学习C++指针,->操作员对我来说似乎很奇怪.而不是 ptr->hello();一个人可以写,(*ptr).hello();因为它似乎也有效,所以我认为前者只是一种更方便的方式.

是这样的情况还是有什么不同?

c++ pointers operators dereference

12
推荐指数
5
解决办法
1175
查看次数

修改C字符串常量?

可能重复:
为什么在写入字符串时会出现分段错误?

我想编写一个函数来反转传递给它的给定字符串.但是我不能.如果我doReverse使用字符数组提供函数(请参阅下面的代码),我的代码运行良好.

我无法弄清楚为什么这不起作用.我能够访问str[0]doReverse,但我不能用一个字符指针改变数组中的任意值.有任何想法吗?

void doReverse(char *str) {
    str[0] = 'b';
}

void main(void) {
    char *str = "abc";
    doReverse(str);
    puts(str);
}
Run Code Online (Sandbox Code Playgroud)

更新:

我知道如何通过将字符数组传递给它来编写反向函数:

void reverse1(char p[]) {
    int i, temp, y;

    for (i = 0, y = strlen(p); i < y; ++i, --y) {
        temp = p[y-1];
        p[y-1] = p[i];
        p[i] = temp;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想编写另一个获取char指针作为参数的版本.

c string pointers

12
推荐指数
4
解决办法
7772
查看次数

你如何检查无效指针?

我目前的代码效果如下:

if( objectPointer != NULL){
    delete objectPointer;
}
Run Code Online (Sandbox Code Playgroud)

不起作用,因为编译器将指针设置为无效的十六进制数,例如:

  • 0xbaadf00d
  • 0xdeadbeef

等等....

那么在尝试删除对象之前检查无效指针的最佳方法是什么?

c++ pointers

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

Objective-C指针?

我是编码新手并尝试使用Objective-C加快速度.碰到了一些我不明白的代码.我希望有人可以为我澄清一下.在下面的例子中,我不确定*foo2是如何工作的以及为什么它没有被释放?

ClassOne *pointer = [[ClassOne alloc]init];

ClassTwo *foo = [[ClassTwo alloc]init], *foo2; 

 foo2 = [foo add: pointer];
 [foo release]; 
 foo = foo2

[pointer release];

[foo release];
Run Code Online (Sandbox Code Playgroud)

oop pointers objective-c

12
推荐指数
2
解决办法
1万
查看次数

为什么我必须在指针上使用free而不是正常的声明?

为什么我在声明指针时必须使用free():

int *temp = (int*)malloc(sizeof(int))
*temp = 3;
Run Code Online (Sandbox Code Playgroud)

但不是我这样做的时候:

int temp = 3;
Run Code Online (Sandbox Code Playgroud)

c free pointers

12
推荐指数
4
解决办法
4713
查看次数

我必须为我的C++类字段使用指针吗?

在阅读了关于指针和引用之间差异的问题之后,我决定使用引用而不是指针用于我的类字段.然而,似乎这是不可能的,因为它们不能被宣布为未初始化(对吧?).

在我现在正在处理的特定场景中,我不想使用正常变量(顺便说一下它们的正确用语是什么?)因为它们在我声明它们时会自动初始化.

在我的代码片段中,bar1自动使用默认构造函数实例化(这不是我想要的),而bar2导致编译器错误,因为你不能使用未初始化的引用(正确吗?),而*bar3很高兴因为指针可以声明未初始化(顺便说一下,最好将此设置为NULL吗?).

class Foo
{
public:
    Bar bar1;
    Bar &bar2;
    Bar *bar3;
}
Run Code Online (Sandbox Code Playgroud)

看起来我必须在这种情况下使用指针,这是真的吗?另外,使用变量的最佳方法是什么? - >语法有点麻烦......运气好吗?什么智能指针,等等?这有关系吗?

更新1:

尝试在我的类中实现引用变量字段并在构造函数中初始化它之后,为什么我会收到以下错误?

../src/textures/VTexture.cpp: In constructor ‘vimrid::textures::VTexture::VTexture()’:
../src/textures/VTexture.cpp:19: error: uninitialized reference member ‘vimrid::textures::VTexture::image’
Run Code Online (Sandbox Code Playgroud)

这是真正的代码:

// VTexture.h
class VTexture
{
public:
    VTexture(vimrid::imaging::ImageMatrix &rImage);
private:
    vimrid::imaging::ImageMatrix &image;
}

// VTexture.cpp
VTexture::VTexture(ImageMatrix &rImage)
    : image(rImage)
{
}
Run Code Online (Sandbox Code Playgroud)

我也试过在标题中这样做,但没有运气(我得到同样的错误).

// VTexture.h
class VTexture
{
public:
    VTexture(vimrid::imaging::ImageMatrix &rimage) : image(rImage) { }
}
Run Code Online (Sandbox Code Playgroud)

更新2:

弗雷德拉森 - 是的!有一个默认的构造函数; 我忽略了它,因为我认为这与问题无关(我多么愚蠢).删除默认构造函数后,我导致编译器错误,因为该类与std :: vector一起使用,需要有一个默认构造函数.因此看起来我必须使用默认构造函数,因此必须使用指针.羞耻......或者是吗?:)

c++ pointers reference

12
推荐指数
2
解决办法
1万
查看次数

C语言中的指针算法

请考虑以下代码片段:

int (*p)[3];
int (*q)[3];

q = p;
q++;
printf("%d, %d\n", q, p);
printf("%d\n", q-p);
Run Code Online (Sandbox Code Playgroud)

我知道指针算法是智能的,这意味着操作q++前进q足够的字节指向下一个3整数数组,所以第一次打印是' 12, 0' 并不意味着递增q使它在12中更大.

但第二次印刷确实令我惊讶.它打印1!
那么为什么它会打印1而不是12?它只是困惑我.

c pointers pointer-arithmetic

12
推荐指数
1
解决办法
8804
查看次数

C99中的易失性语义

我有一些低级代码我写,我需要使用对象为挥发性的问题,但它不一定是这样,我想声明的类型为挥发性(可重用的原因).但是,我可以定义指向结构的限定变体的指针,如以下段中所述.

struct x {
  int bar;
};

struct x foobar;
...
volatile struct x *foo = &foobar;
Run Code Online (Sandbox Code Playgroud)

现在foo实际上是指向该类型对象的指针:

volatile struct x {
  volatile int x;
};
Run Code Online (Sandbox Code Playgroud)

因为volatile适用于所有struct成员.现在我的问题是当一个对象包含指向另一个对象的指针时,如何应用波动性?

struct x {
  struct y *bar;
};
Run Code Online (Sandbox Code Playgroud)

指向x的volatile实例的指针然后将其视为:

volatile struct x {
  struct y * volatile bar;
};
Run Code Online (Sandbox Code Playgroud)

或作为:

volatile struct x {
  volatile struct y * volatile bar;
};
Run Code Online (Sandbox Code Playgroud)

我已经阅读了C标准,对此并不是很清楚,我可以通过多种方式轻松解释这些措辞.

c pointers volatile c99

12
推荐指数
1
解决办法
1753
查看次数