在C中挣扎着指针

时间:2011-06-05 21:34:42

标签: c pointers

我认为我按照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?

感谢。

5 个答案:

答案 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)

  1. customList是一个本地指针; arrayOfLists是一个全局数组。他们生活在不同的记忆区域。

  2. &的优先级低于.->。如果我要将第一个表达式简化为j,则第二个表达式将简化为&j

  3. 指针就像任何其他类型一样。在下面的代码中

    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,假设ptr1ptr2是指向ptrToStruct所指向的结构的指针,那么是的,ptr1仍指向它指向的任何结构。您从未修改ptr1变量,只修改了它指向的结构。由于ptr1ptr2都指向相同的结构(换句话说,别名),因此在访问成员ptr1->intProp时应该会看到相同的值。