C中变量和数组中的指针取消引用

Pointer dereferencing in a variable and in an array in C

我对指针有些困惑。我正在使用的以下代码中有两个,它们正在工作,但我不是 100% 确定它们为什么工作。

第一个是

char *note = "A7";

第二个是

char *octFreq[15] = 
       {"1","55","2","110","3","220","4","440","5","880","6","1760","7","3520"};

虽然我必须在数组之前而不是在单个变量之前使用 *,但它们都得到了每个的值。我可以通过使用 note 来获取 note 的值,但不能为 octFreq.

执行此操作

这是我有点困惑的代码行,所有代码紧随其后。

    if(note[1] == *octFreq[x]){//WHY DO I HAVE TO DEREFERENCE octFreq and not note????

#include <stdio.h>
#include <cs50.h>
#include <stdbool.h>
#include <string.h>

int main(void){ //Notes are in this order C D E F G A B

    char *note = "A7";
    //char freq;
    int semiUpDown = 0;

    char *octFreq[15] = {"1","55","2","110","3","220","4","440","5","880","6","1760","7","3520"};

    //int noteIndex[7] = {1, 2, 3, 4, 5, 6};

    if(note[1] == '#'){
        semiUpDown = 1;
        //Up one semitone or multipled by 2^1/12
    }else if(note[1] == 'b'){
        semiUpDown = -1;
        //Down one semitone or divide by 2^1/12
    }

    if(semiUpDown == 0){//This means no flat or sharp

        if(note[0] != 'B' || note[0] != 'b'){//Check the first letter is CDEFGA

            if(note[0] == 'A' || note[0] == 'a'){//Check to see if it's the baseline

                for(int x = 0; x < 13; x++){

                    //printf("%s\n\n", noteA[x]);

                    if(note[1] == *octFreq[x]){//WHY DO I HAVE TO DEREFERENCE octFreq and not note????
                        //freq = *octFreq[x+1];
                        // printf("Found it:  %s\n\n", noteA[x]);
                        printf("This is the frequency:  %s\n\n", octFreq[x+1]);
                    }
                }    
            }
        }
    }
}

if(note[1] == *octFreq[x]) 仅比较单个字符,因此它适用于 A7 但不适用于 A110。在那里你需要使用 strcmp,它使用 char * 来比较整个字符串。像这样;

if (0 == strcmp(&note[1], octFreq[x]))

索引运算符 ([]) 是从基本指针值自动取消引用特定整数。

所以,解释一下。指针实际上只是一个保存内存位置的变量。此内存位置是一个特定的整数值(即 40009320 等)。您可以对该变量进行加、减、乘、除等操作,以获得指向指针所指向类型的有效值的新内存位置(在本例中为 char)。

您的第一个指针变量 note 可以这样定义:

char* note = new char[3];
*(note + 0) = 'A';
*(note + 1) = 'F';
*(note + 2) = '[=10=]'; \all character arrays have an implicit null-terminator

每个字符可以被引用为:note[x],其中 0 <= x <= 2。note[x] 也可以读作 *(note + x)

char *note = "A7" 意味着你已经声明了一个指向 char 数组的指针。因此,您可以像任何其他数组一样通过 note[0] 等访问其元素。

char *octFreq[15] 表示您声明了一个指向 char 指针数组的指针。

octFreq[15] 将到达索引 15 处的 char 指针。 *octFreq[15] 将到达索引 15 处的 char 指针指向的 char。

char*注="A7"; // 在这里定义 note - 字符数组 ('A', '7', '\0')。当您访问 note[1] 时,您会得到第二个符号 ('7')。

char* octFreq[15] = {"1","55","2","110","3","220","4","440","5"," 880","6","1760","7","3520"}; // 在这里定义 octFreq - char 数组。有 15 个数组,每个数组的类型都是 char*。因此,当您访问 octFreq[3] 时,您将获得 array of arrays of char 的第四个元素,它是 array of chars ("110"在这个例子中)。然后你应用 * 到这个 字符数组 并且你得到这个数组的第一个元素(这里是粗体 -> "110" ), 因为指向 字符数组 (char*) 的指针实际上指向它的第一个元素。