标签: pointer-arithmetic

在c ++类中进行指针数学运算:它是"合法的"吗?

阿海,海,

我想知道是否可以做以下事情:

class SomeClass
{
   int bar;
};

SomeClass* foo = new SomeClass();
int offset = &(foo->bar) - foo;

SomeClass* another = new SomeClass();
*(another+offset) = 3; // try to set bar to 3
Run Code Online (Sandbox Code Playgroud)

只是好奇,Dan O.

c++ pointers class pointer-arithmetic

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

strchr的问题

我无法理解为什么下面的C代码不起作用:

int obtainStringLength(char* str, char c1, char c2) {
    char* firstOcurrence = strchr(str, c1);
    char* endOcurrence = strchr(str, c2);
    return 2+(endOcurrence - firstOcurrence) / sizeof(char*);
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是找到c1和之间有多少个字符c2:

printf("%d\n", obtainStringLength("abc def ghi", 'a', 'i')); //should yield 11
Run Code Online (Sandbox Code Playgroud)

不幸的是,这总是打印1.问题是什么?不应该strchr像C#一样工作string.IndexOf()吗?

c pointer-arithmetic

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

C中的数组赋值使用指针算术

当我使用指针算法访问特定元素时,如何更改数组中的值?

#include <stdio.h>

int main() {
  int a[3] = {1, 1, 1}, b[3] = {2, 2, 2};

  a++ = b++; // How can I get this to work so a[1] = b[1]?

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

c arrays pointers pointer-arithmetic

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

为什么将void指针递增1会向前移动一个字节,但对于整数指针,它是4个字节,对于double是8?

在下面的程序中,如果我向void指针添加1,它会向前移动一个字节.但是,正如预期的那样,它分别为指针intdouble指针移动4和8个字节.为什么 void指针移动1个字节,就像一个字符指针会吗?

#include<stdio.h>

int main(void)
{

        int num=3,*int_ptr=&num;
        double sum=3,*double_ptr=&sum;
        void *void_ptr1=&num,*void_ptr2=&sum;
        printf("%p,%p,%p,%p,%p,%p,%p,%p",void_ptr1,void_ptr1+1,\
        void_ptr2,void_ptr2+1,int_ptr,int_ptr+1,double_ptr,double_ptr+1);
}
Run Code Online (Sandbox Code Playgroud)

c pointers void-pointers pointer-arithmetic

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

数组内存分配不起作用

我有下一堂课:

class A {
};

class B : public A {
  int num;
};
Run Code Online (Sandbox Code Playgroud)

在我的主要我有:

int main() {
    A* vec; // A is a class with pure virtual functions
    vec = new B[2]; // want to create a vector of B
}
Run Code Online (Sandbox Code Playgroud)

正确定义了vec [0],但vec [1]为NULL.为什么不给我一个合适的记忆?

我不想改变主线.只是让它工作.

(我知道我可以把主要改成:B*vec = new B [2]但我不想要)

任何帮助赞赏!

c++ polymorphism memory-management pointer-arithmetic

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

具有不同类型的指针算法并理解结果?

请考虑以下代码:

static void Main(string[] args)
{
    int max = 1024;
    var lst = new List<int>();
    for (int i = 1; i <= max; i *= 2) { lst.Add(i); }

    var arr = lst.ToArray();

    IterateInt(arr);
    Console.WriteLine();
    IterateShort(arr);
    Console.WriteLine();
    IterateLong(arr);
}

static void IterateInt(int[] arr)
{
    Console.WriteLine("Iterating as INT ({0})", sizeof(int));
    Console.WriteLine();

    unsafe
    {
        fixed (int* src = arr)
        {
            var ptr = (int*)src;
            var len = arr.Length;
            while (len > 0)
            {
                Console.WriteLine(*ptr);
                ptr++;
                len--;
            }
        }
    }
}

static void …
Run Code Online (Sandbox Code Playgroud)

c# pointers pointer-arithmetic

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

用复杂指针算法输出C程序

我正准备进行有关猜测C代码输出的编程测验.

经过长时间的尝试,我仍然在努力理解以下代码的输出:

#include <stdio.h>

char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;

int main()
{
    printf("%s ", **++cpp);
    printf("%s ", *--*++cpp+3);
    printf("%s ", *cpp[-2]+3);
    printf("%s ", cpp[-1][-1]+1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产量

TEST sQuiz Z CQ
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我理解为什么这个输出?

c pointers pointer-arithmetic

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

void*的增量类型转换为char*失败

在这样的函数中:

char nextchr (void* p)
{
    ((char*)p)++;

    return *(((char*)p));
}
Run Code Online (Sandbox Code Playgroud)

这应该返回传递的字符串文字的第二个字符,因为参数p根本无法做到.

为什么会这样?


解决方案总结:

@MM: ++需要一个左值(左手值)来应用它,而类型转换的结果不是那个.

@OP更新:一些编译器(通常/旧的C89// 编译器 /类似我的)可以允许((char*)source)++;/只要它不作为参数传递给函数/,即使它是非法的并且被C标准证明是非法的.

c pointers void c89 pointer-arithmetic

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

有没有一种“不错的”方法可以将指向结构的指针前进一个字节?

我有一个指向要在一个地址范围内逐字节移动的结构的指针。我有一种可行的方法,但在我看来却很难看。不幸的是,“不错”的方法行不通。这是一个最小的示例:

#include <stdint.h>

typedef struct {
    uint32_t a;
    uint32_t b;
} s_t;

int main( int argc, char** argv )
{
    uint32_t address = 17;
    s_t* ps = (s_t*) address;

    // ugly
    uint8_t* gna = (uint8_t*) ps;
    ++gna;
    ps = (s_t*) gna;

    // nice
    ++((uint8_t*) ps);
}
Run Code Online (Sandbox Code Playgroud)

编译器在“ nice”部分报告错误:

% gcc test.c -o test.bin
test.c: In function 'main':
test.c:17:5: error: lvalue required as increment operand
     ++((uint8_t*) ps);
     ^
Run Code Online (Sandbox Code Playgroud)

我理解该错误,但我认为强制转换为uint8_t *会创建一个左值。显然,我错了。

有没有办法使它更好?

c lvalue pointer-arithmetic

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

变量不在数组中的指针算法

我有以下问题; 如果a是一个带有10个元素的int数组,我可以定义指针

int*b=&a[3]; 
int*c=&[2];
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用这些指针进行算术运算,int d=a-c;这将返回b和c之间数组中int值的数量.所以我的问题是,如果我也被允许对任何可能不在数组中的变量进行这样的指针算术运算.例如:

int a=10; 
int b=20; 
int*c=&a; 
int* d=&b;
Run Code Online (Sandbox Code Playgroud)

然后做int e=d-c;int*e=c+1;

我问的原因是我收到了有关这是否会导致未定义行为的相互矛盾的信息,

c arrays pointer-arithmetic

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