包含指针算术,是否会自动转换为有符号变量的整数?如果是,为什么?
假设我这样做
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课,这个想法刚出现在我脑海中:
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数组,编译器应该"知道"元素位置的本地化,如果使用指向该数组的变量指针可能需要更多的处理时间,另一方面在搜索时可能更快我想要显示的项目.什么是更快/更小/优化的方法?
先感谢您.
随着代码:
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)
为什么我会收到访问冲突?我应该改变什么?
#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()声明怎么样,输出会是什么?
我正在学习指针算术,我遇到了这样的事情:
char *str1, *str2;
/* stuff in between */
int f = str2 - str1;
Run Code Online (Sandbox Code Playgroud)
什么str2 - str1回来了?比方说str1 = "foo"和str2 = "foobar".
我有一个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通过其他方式找到一对的另一半?
我试图找到两个变量之间的内存距离.具体来说,我需要找到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*'不是兼容类型的指针 ".谢谢大家都会帮助我
换句话说:如果我有这样分配的数组,它是否可以保证:
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标准(C11)中是否合法?
void*void*或者相当于代码:
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似乎没有涵盖这一点:指针.
我有一个大型uint8_t数组(大小= 1824 * 942)。我想对每个元素执行相同的操作。特别是我需要从每个元素中减去-15。
该阵列每秒刷新20次,因此时间是个问题,我避免在阵列上循环。
是否有捷径可寻?