-3

我最近在回顾一篇关于指针的优秀、高度赞扬的文章:理解指针的障碍是什么,可以做些什么来克服它们? 当我阅读它时,我开始理解指针是什么。不幸的是,我仍然无法使用它们。

原因如下:我不懂命名!或者是指针的应用。在阅读了几本'so-you-want-to-learn-c'的书籍和文章后,我一次又一次地遇到了类似的代码:“如何创建和实例化指针”。

回答时,请使用示例代码来演示在实践中指针输出的内容。

这是代码:

char ch = 'c'; 
char *chptr = &ch;

或者,也许更令人困惑:

char ch = 'c';
char *chptr;
chptr = &ch;

请注意,chptr它的命名与其他两个变量不同,它们名为ch。为什么不命名所有三个变量ch?给指针起一个不同的名字能解决什么问题?

此外,在我们的第一段代码中...*chptr = &ch;;在第二个,chptr = &ch;。是什么使得在第二个块中删除星号是可以接受的?

接下来,我想知道指针的应用是什么。我是否总是需要一个指针(什么时候需要,什么时候不需要)?提交答案后,我感到自信——相信我将能够理解使用指针的更复杂的代码——足以继续直观地适应语言。不过,我仍然充满好奇。

以这段代码为例:

typdef struct person
{
  char *name;
  int age;
}

为什么将 name 声明为指向不存在的 name 变量的指针,为什么将 age 变量声明为 int 而不使用指针?由于这个块,这没有意义:

int main()
{
/* below, the int is a pointer */
  int *p;
  void *up;
  return 0;
}

或者这个块:

char *sp;
sp = "Hello";
printf("%s",sp);

我认为指针指向一个地址。“你好”不是地址。

考虑到前面的两个块,看看最后一个块:

int main()
{
  int i,j;
  int *p;
  i = 5;
  p = &i;
  j = *p; //j = i?
  &p = 7; //i = 7?
}

不应该将 j 设置为 &i 因为*p = &inot i。并且不应该&p = 7将p的地址设置为7,这可能不是i?

4

2 回答 2

2

请注意,chptr 的名称不同——此时我添加了一个答案——来自其他两个变量,它们被命名为 ch。为什么不命名所有三个变量 ch?

  • 通常的做法是指针以“p”为前缀(或在这种情况下以“ptr”为后缀),以便代码阅读器清楚该变量是一个指针。正如您现在所知,使用指针编程最初很困难,虽然int *i = 1;int i = 1都是合法的,但无意中用一个代替另一个可能会导致一些严重的调试时间。

此外,在第一个代码块中,我们有 ...*chptr = &ch;; 在第二个中,chptr = &ch;。是什么使得在第二个块中删除星号是可以接受的?

  • 这是使用“*”声明指针变量的语法,例如:int *pInt;
  • 为指针变量赋值(使其指向某个东西),你不需要'*'。前任:

        int *pInt;
        pInt = &someInt;
    
  • 但是,要将值分配给指针变量指向的地址或获取变量指向的值,您必须使用 '*' 取消引用它

        int *pInt;
        int someInt = 100;
        pInt = &someInt;
        *pInt = 50;
        printf("%d - %d", *pInt, someInt); // prints "50 - 50"
    

接下来,我想知道指针的应用是什么。

  • 指针用于,除其他外:

    1. 将值传递给函数
    2. 动态内存分配...

为什么将 声明name为指向不存在的名称变量的指针,以及为什么将age变量声明为 int 而不使用指针?

  • “你好”是一个 5 个字符的数组。使用sp = "Hello", "Hello" 被存储在一个内存位置,它的地址被分配给sp.
  • 从您的示例中,我假设名称可能包含任意数量的字符,因此在程序执行期间,将使用动态分配来存储名称。

我认为指针指向一个地址。“你好”不是地址。

  • “Hello”(C 中的字符串)被视为字符数组。在这种情况下,sp 指向一个包含 5 个字符的数组的内存位置(堆或堆栈),当您在赋值中使用它时,它将返回“Hello”字符串在内存中的地址。

    int main()
    {
      int i,j;
      int *p;
      i = 5;
      p = &i;
      j = *p; //j = i?
      &p = 7; //i = 7?
    }
    
    • j不是i,从某种意义上说,改变j=100不会影响i(i仍然具有价值5) 的价值。

    • &p = 7可能不是您想要的。它可能会导致错误,因为&p会产生一个值,并且将值分配给一个值是非法的(例如:它将评估为这样的东西0x0108 = 7;:)

    • 考虑上述变量的以下内存示例

       address | var    | value
       0x0100  | i      | undefined
       0x0104  | j      | undefined
       0x0108  | p      | undefined
      
    • j = *p,

       0x0100 | i      | 5
       0x0104 | j      | 5
       0x0108 | p      | 0x0100
      

之后*p=7(修正自&p = 7;

         0x0100 | i      | 7
         0x0104 | j      | 5
         0x0108 | p      | 0x0100
于 2012-12-07T06:31:40.660 回答
1
Example code:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;
    long j;
    int *p;

    i = 5;
    p = &i;  ---> Assigning address of "i" to p, so that pointer p points to "i"
                  By dereferencing pointer "p" i.e. by *p, shall retrieve value "5". 

    j = *p; or j = i (alternative to assign value "5" to "j")

    printf("Value of j:%d \n", j); --> Output is "5".

    &p = 7; //i = 7? --> will not change the value of "i" to 7, but instead  
                         will try to change the address of "p", which cannot be 
                         modified.                              

    j = (long)&i;  ---> Assigns address of "i" i.e "100" to "j". 

    printf("Value of j:%p \n", j); --> Output is address of "i" i.e. "100"

    printf("Value of i:%d \n", i); --> Output is "5". Value assigned to "i".

    printf("Address of i:%p \n", &i); --> Output is "100" i.e. address of "i" in our
                                          case.

    printf("Value of *p:%d \n", *p); --> Output is "5". Since pointer p is pointing 
                                        to "i" i.e. "100" in our case. 
                                        *p -> by dereferencing, retrieves value 
                                        present at the address "100" 
                                        that would be "5".

    printf("Value of p:%p \n", p); --> Output is "100". Pointer p is pointing 
                                       to "i" i.e. "p = &i" it will be "100" in our 
                                       case.   

    printf("Address of p:%p \n", &p); --> Output would be the address of pointer "p".
                                          It will not be same as the address of "&i" 
                                          or value present in "p".

    return 0;       
}
于 2012-12-07T04:46:28.790 回答