标签: pointer-arithmetic

指针算术和签名/无符号转换!

包含指针算术,是否会自动转换为有符号变量的整数?如果是,为什么?

假设我这样做

int *pointer; 
int *pointerdiff;
unsigned int uiVal = -1;

pointerdiff = pointer + uiVal // Pointer will contain valid address here.
Run Code Online (Sandbox Code Playgroud)

其中指针是指向int的指针,uiVal初始化为-1,然后我发现指针中的地址减少了4.为什么这里没有考虑无符号值-1?

c pointer-arithmetic

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

常量指针数组或指向数组的指针?什么是更快的C?

您好,我现在正在中级C课,这个想法刚出现在我脑海中:

int multi[3][4]; // const multidimensional array

int* ptr = *multi; // ptr is a pointer variable that hold the address of multi const array
Run Code Online (Sandbox Code Playgroud)

那么,访问多维数组位置的更快/更小/优化是什么?

这个:

multi[3][1]; // index the value position
Run Code Online (Sandbox Code Playgroud)

要么

*(*(multi+2)+1); // pointer to the position on the array
Run Code Online (Sandbox Code Playgroud)

或(更新)

ptr += 9; // pointer arithmetic using auxiliary pointer
Run Code Online (Sandbox Code Playgroud)

由于"multi"是一个const数组,编译器应该"知道"元素位置的本地化,如果使用指向该数组的变量指针可能需要更多的处理时间,另一方面在搜索时可能更快我想要显示的项目.什么是更快/更小/优化的方法?

先感谢您.

c arrays pointers pointer-arithmetic

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

指针算术中的访问冲突

随着代码:

int nsize;
int * buffer;
char TargetBuffer[4096];
const SIZE_T buffersize = (320*240) * sizeof(int);


buffer = (int *) malloc(bufferSize);
// fill buffer with data

nsize = 0;
while(nsize < buffersize)
{
    // HERE after some loops i get Access Violation
    memcpy(TargetBuffer, buffer + nsize, 4096);


    // do stuff with TargetBuffer
    nsize += 4096;
}
Run Code Online (Sandbox Code Playgroud)

为什么我会收到访问冲突?我应该改变什么?

c pointer-arithmetic

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

在整数数组的情况下,指针减法究竟是如何工作的?

#include<stdio.h>
int main()
{
    int arr[] = {10, 20, 30, 40, 50, 60};
    int *ptr1 = arr;
    int *ptr2 = arr + 5;
    printf("Number of elements between two pointer are: %d.", 
                                (ptr2 - ptr1));
    printf("Number of bytes between two pointers are: %d",  
                              (char*)ptr2 - (char*) ptr1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于第一个printf()语句,输出将5根据Pointer减法混淆

第二个printf()声明怎么样,输出会是什么?

c pointers pointer-arithmetic

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

字符指针算术C.

我正在学习指针算术,我遇到了这样的事情:

char *str1, *str2;

/* stuff in between */

int f = str2 - str1;
Run Code Online (Sandbox Code Playgroud)

什么str2 - str1回来了?比方说str1 = "foo"str2 = "foobar".

c char pointer-arithmetic

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

如何在配对结构中可移植地保存两个字的内存?

我有一个struct foo总是成对出现的数据结构.现在,每个人都struct foo携带指向另一struct foo对的指针:

struct foo {
    struct foo *other_half;
    /* ... */
};
Run Code Online (Sandbox Code Playgroud)

由于我的程序需要很多(> 1'000'000)struct foo,我迫切希望减小每个程序的大小.有没有办法摆脱other_half指针,并struct foo通过其他方式找到一对的另一半?

c bit-manipulation pointer-arithmetic

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

不同类型指针之间的减法

我试图找到两个变量之间的内存距离.具体来说,我需要找到char []数组和int之间的距离.

    char data[5];
    int a = 0;

    printf("%p\n%p\n", &data[5], &a);

    long int distance = &a - &data[5];

    printf("%ld\n", distance);
Run Code Online (Sandbox Code Playgroud)

当我在没有最后两行的情况下运行我的程序时,我得到了两个变量的正确内存地址,如下所示:

   0x7fff5661aac7
   0x7fff5661aacc
Run Code Online (Sandbox Code Playgroud)

现在我明白了,如果我没错,两者之间有5个字节的距离(0x7fff5661aac8,0x7fff5661aac9,0x7fff5661aaca,0x7fff5661aacb,0x7fff5661aacc).

为什么我不能减去类型(int*)和类型(char*)之一的指针.两者都是指内存地址..我该怎么做才能计算两者之间的距离,以字节为单位?我尝试了两个指针中的一个,但它没有用.

我得到:" 错误:'char*'和'int*'不是兼容类型的指针 ".谢谢大家都会帮助我

c pointers subtraction pointer-arithmetic

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

是否保证C中的数组元素将连续存储,没有填充?

换句话说:如果我有这样分配的数组,它是否可以保证:

void *arr = calloc(nmemb, sizeof(some_type))
Run Code Online (Sandbox Code Playgroud)

然后elta,eltb,eltc将所有指向在存储器中的相同位置,这将是类型的第二个元素some_type此数组的?

some_type *elta = &((some_type*)arr)[1];
some_type *eltb = ((some_type*)arr)+1;
some_type *eltc = (char*)arr+sizeof(some_type);
Run Code Online (Sandbox Code Playgroud)

我问这个的原因是因为我试图在C中做一个"容器",如果这不成立,那么我就没有想法如何返回指向除第一个之外的任何其他元素的指针.

c arrays padding memory-alignment pointer-arithmetic

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

你可以将"指向函数指针的指针"转换为void*

通过评论我的回答启发这里.

这一系列步骤在C标准(C11)中是否合法?

  1. 创建一个函数指针数组
  2. 一个指针指向的第一项和铸造的指针函数指针void*
  3. 对此执行指针运算 void*
  4. 将其强制转换为指向函数指针的指针并取消引用它.

或者相当于代码:

void foo(void) { ... }
void bar(void) { ... }

typedef void (*voidfunc)(void);
voidfunc array[] = {foo, bar}; // Step 1

void *ptr1 = array; // Step 2

void *ptr2 = (char*)ptr1 + sizeof(voidfunc); // Step 3

voidfunc bar_ptr = *(voidfunc*)ptr2; // Step 4
Run Code Online (Sandbox Code Playgroud)

我认为这是允许的,因为实际的函数指针只能通过正确键入的指针访问.但Andrew Henle指出,标准部分6.3.2.3似乎没有涵盖这一点:指针.

c function-pointers pointer-arithmetic language-lawyer c11

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

减去或添加常数到大型数组

我有一个大型uint8_t数组(大小= 1824 * 942)。我想对每个元素执行相同的操作。特别是我需要从每个元素中减去-15。

该阵列每秒刷新20次,因此时间是个问题,我避免在阵列上循环。

是否有捷径可寻?

c++ arrays math pointer-arithmetic integer-arithmetic

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