我有一点点指针算术和一般指针,我把这个代码拉到了一起。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int main(int argc,char **argv){
void *ptr=NULL;
char a='a';
int i0=0;
char b='b';
int i1=1;
char c='c';
int i2=2;
ptr=&a;
//What do I do here to get to i0?
printf("%d",(int*)ptr); //and to print it out?
while(1);
return 0;
}
我的问题正是我在评论中提出的问题。如何在不执行'ptr =&amp; i0;'的情况下让ptr指向i0使用指针算术?另外,我如何正确地为字符和整数打印出来(char的一个方法和int的一个方法)。
提前致谢。 ;)
答案 0 :(得分:6)
获取指向i0
位置的指针的方法是& i0
。
虽然某些编译器可能会i0
对齐,因此可以使用* ((int*) (((char*) ptr) - 1))
来访问i0
,但这并不能保证。编译器经常重新排序局部变量,甚至可能根本不将它们存储在内存中。
答案 1 :(得分:1)
使用指针算法无法使ptr
指向i0
。指针算法仅在单个数组对象的范围内工作(非数组变量被视为大小为1的数组)。您不能使用指针算法使指针从一个独立对象跳到另一个对象。
答案 2 :(得分:1)
您的代码没有意义。您无法保证a,i0,b,i1,c和i2在创建时在内存中的定义 - 因此您无法使用指针算法从(ptr =&amp; a)的地址移动到I0。
如果你想让ptr等于i0的位置你可以做ptr =&amp; i0。如果i0是一个整数(它是)它将是4个字节大,所以如果你的指针是void / char,你可以使用指针算法一次移动整数1 btye。
答案 3 :(得分:1)
你不能这样做。
指针算法适用于指向数组元素的指针,您可以对指向数组内元素的指针进行算术运算,以调整指向同一数组中另一个元素的指针。
您不能对指向变量的指针进行指针运算,并使其指向另一个不相关的变量。
答案 4 :(得分:1)
您只能在整个对象(如数组)中进行指针运算。这有效:
#include <stdio.h>
int main(void) {
int arr[100];
int *ptr;
arr[42] = 42;
ptr = arr; /* ptr points to the 1st element */
printf("%d\n", *(ptr + 42)); /* contents of the 43rd element */
return 0;
}
答案 5 :(得分:0)
在此代码示例中,未执行
ptr=&i0;
您无法让ptr
指向i0
便携式,因为,
i0
只是一个本地变量&amp;它的地址不存储在任何其他变量中。
答案 6 :(得分:0)
我唯一能想到的是:
ptr += ((char*)&i0 - &a)
但不确定它是否有效且与ptr = &i0
无差别
正如其他人指出的那样,根据标准,你只能在单个对象的边界内进行指针运算,比如结构或数组,所以上面的代码即使它可能有用也不是真的正确
答案 7 :(得分:0)
你必须做这样的事情:
int main(void)
{
union u
{
char ch;
int i;
} arr[] = { { .ch = 'a' }, { .i = 0 }, { .ch = 'b' }, { .i = 1 } };
union u *ptr = &arr[0];
printf("%d\n", ptr[1].i);
}
不完全是你写的但可以工作。