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(¬e[1], octFreq[x]))
索引运算符 ([]
) 是从基本指针值自动取消引用特定整数。
所以,解释一下。指针实际上只是一个保存内存位置的变量。此内存位置是一个特定的整数值(即 4000
、9320
等)。您可以对该变量进行加、减、乘、除等操作,以获得指向指针所指向类型的有效值的新内存位置(在本例中为 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*) 的指针实际上指向它的第一个元素。
我对指针有些困惑。我正在使用的以下代码中有两个,它们正在工作,但我不是 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(¬e[1], octFreq[x]))
索引运算符 ([]
) 是从基本指针值自动取消引用特定整数。
所以,解释一下。指针实际上只是一个保存内存位置的变量。此内存位置是一个特定的整数值(即 4000
、9320
等)。您可以对该变量进行加、减、乘、除等操作,以获得指向指针所指向类型的有效值的新内存位置(在本例中为 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*) 的指针实际上指向它的第一个元素。