我认为我按照C教程理解指针的基本概念,但实际编码时我真的很困惑。我有一些问题:
1 - 让我说我有:
customList arrayOfLists[3]; //global
//...
void someMethod()
{
int i;
for (i=0; i<3; i++)
{
customList l = arrayOfLists[i];
//METHOD1
//Next time I come back to this function, element is still there!
removeFirstElement(&l);
//METHOD2
//Next time I come back to thsi function, element is gone!
//removeFirstElement(&(arrayOfLists[i]));
}
}
为什么Method1和Method2的工作方式不一样?在这两种情况下,我基本上都是说删除位于addressX的列表的第一个元素。它是否创建了数组的副本?
2 - 有什么区别:
struct1.ptr1->ptr2->someIntValue //1
&(struct1).ptr1->ptr2->someIntValue //2
第二种方式对我来说没有意义,我真的不知道那里发生了什么,但似乎有效。我期待第一种方式工作,但它没有给我正确的答案。
3 - 让我说我这样做:
ptr2 = ptrToStruct;
ptr1 = ptr2;
ptr2->intProp = 5;
ptr2 = ptrToStruct2;
ptr1是否仍指向初始内存位置,还是ptr2相同?什么是ptr1-&gt; intProp?
感谢。
答案 0 :(得分:1)
指针很难掌握,因为它们抽象了计算机的内存而没有在指针操作描述中引用该内存。
如果你学习了一些汇编程序,指针会更容易理解。
答案 1 :(得分:0)
customList l = arrayOfLists[i];
//METHOD1
//Next time I come back to this function, element is still there!
removeFirstElement(&l);
这是错的:你需要类似的东西:
customList *l = &arrayOfLists[i];
removeFirstElement(l);
关于第二个问题:
struct1.ptr1->ptr2->someIntValue // this will give you someIntValue
&(struct1).ptr1->ptr2->someIntValue // this will give you the address of memory where someIntValue is stored
答案 2 :(得分:0)
Q3)
ptr2 = ptrToStruct;
ptr1 = ptr2;
ptr2->intProp = 5;
ptr2 = ptrToStruct2;
ptr1是否仍指向初始内存位置,还是ptr2相同?
是的,ptr1
指向ptrToStruct
指向的内存位置。影响ptr2
指向其他位置(ptrToStruct2
)不会影响ptr1
。
什么是ptr1-&gt; intProp?
5
答案 3 :(得分:0)
customList
是一个本地指针; arrayOfLists
是一个全局数组。他们生活在不同的记忆区域。
&
的优先级低于.
或->
。如果我要将第一个表达式简化为j
,则第二个表达式将简化为&j
。
指针就像任何其他类型一样。在下面的代码中
int j, k;
k = 5;
j = k;
k = 12;
j有5或12吗?
答案 4 :(得分:0)
对于问题1,方法1采用变量l
的地址。初始化l
以保存副本数组的i
项的值。这是一个完全不同的内存位置。请注意,如果removeFirstElement()
函数依赖于作为指向数组的指针的参数,那么它将使用方法1失败。
<小时/> 对于问题2,第2行是有效的,但不是因为您可能认为的原因。它评估的是获取
struct1.ptr1->ptr2->someIntValue
的地址。请注意,您没有获取结构的地址,而是获取它指向的成员的成员。你可能认为它是:
(&struct1).ptr1->ptr2->someIntValue
这会悲惨地失败。
成员访问运算符(.
)用于结构值以访问成员。你在LHS上有一个结构的指针,应该使用箭头操作符(->
)来访问该成员。或者,首先取消引用指针,然后使用点(箭头运算符相当于)。
(*(&struct1)).ptr1
/* is equivalent to: */
(&struct1)->ptr1
<小时/> 对于问题3,假设
ptr1
和ptr2
是指向ptrToStruct
所指向的结构的指针,那么是的,ptr1
仍指向它指向的任何结构。您从未修改ptr1
变量,只修改了它指向的结构。由于ptr1
和ptr2
都指向相同的结构(换句话说,别名),因此在访问成员ptr1->intProp
时应该会看到相同的值。