示例如下。根据我的理解,t
和p
是指向字符串地址的相同指针?
我对指针和字符串感到困惑。 puts(p)
会给出字符串的地址而不是字符吗?另外,我无法弄清strchr
函数的工作原理。 ++ p将指向'之后的下一个字符:',它是如何工作的,它是否正确?
请帮忙!感谢。
char *t = "MEAS:VOLT:DC?";
char *p;
p = t;
puts( p );
while(( p = strchr( p, ':' )) != NULL )
{ puts( ++p )}}
答案 0 :(得分:1)
什么是指针?指针是存储地址(存储器)的变量 地点)。这可以是另一个变量的地址
int n = 9;
int *ptr = &n; // stores the address of n
或者它可以是内存块的开始,例如动态分配 内存块:
int *fields = malloc(len * sizeof *fields);
无论指针指向哪个地址,我们都使用指针直接访问 存储在指针中的内存(我们也说指针所在的) 指向)。
什么是字符串?您必须了解的是C没有像其他类型的字符串类型
编程语言呢。在C中,字符串只是一个8位值序列
(代表字符)以'\0'
- 终止字节结尾。自然
单个字符的类型是char
,这就是我们使用char*
或char[]
的原因
得到一个字符串。
当你这样做时
const char *str = "Hello";
str
指向内存中的某个位置,它看起来像这样:
b = base address of the first character in the
sequence
b b+1 b+2 b+3 b+4 b+5
+-----+-----+-----+-----+-----+------+
| 'H' | 'e' | 'l' | 'l' | 'o' | '\0' |
+-----+-----+-----+-----+-----+------+
像'H'
这样的字符常量的整数值由
ASCII表。所以实际上内存看起来像这样:
b = base address of the first character in the
sequence
b b+1 b+2 b+3 b+4 b+5
+----+-----+-----+-----+-----+-----+
| 72 | 101 | 108 | 108 | 111 | 0 |
+----+-----+-----+-----+-----+-----+
因此str
指向该位置b
,str[0]
是第一个字符str[1]
是第二个,等等。如你所见,要获得一个字符串,你只需要访问
序列中的第一个字符。这就是我们使用char*
的原因
指向地址字符串的指针,因为我们可以访问char*
指针
字符串中的第一个和后续字符。
像puts(str)
这样的函数执行以下操作:
'\0'
- 终止字节?
因此puts(str)
不会打印指针指向的地址,它会打印内存所在的内容
指针指向。
像strchr
这样的函数的工作原理如下:
man strchr
char *strchr(const char *s, int c);
<强>描述强>
strchr()
函数返回指向字符串c
中第一个字符s
的指针。
现在您已了解字符串的内存布局,这应该很容易 了解。我们来看看这个:
const char *str = "Hello";
char *f = strchr(str, 'l');
请记住,str
指向的内存布局是:
b = base address of the first character in the
sequence
b b+1 b+2 b+3 b+4 b+5
+-----+-----+-----+-----+-----+------+
| 'H' | 'e' | 'l' | 'l' | 'o' | '\0' |
+-----+-----+-----+-----+-----+------+
^
¦
first occurrence
of 'l'
所以strchr
返回的是一个指向b+2
(或str+2
的指针,因为在
我的例子b是指针str
正在存储的值。
这就是为什么你puts(str)
时Hello
得到puts(f)
以及何时llo
你得到strchr
。
char *strchr(const char *s, int c);
{
// stop when the \0-terminating byte is reached
for(size_t i = 0; s[i] != '\0'; ++i)
{
if(s[i] == c)
return &s[i]; // or return s+i; using pointer arithmetic
}
return NULL; // c is not found in the string
}
的一个简单实现是:
while(( p = strchr( p, ':' )) != NULL )
{
puts( ++p )
}
这是做什么的?
strchr
第一次NULL
返回的值不是:
时,它会返回
指向第一次出现冒号puts(++p)
的指针。 p = p + 1; // let p point to the next next character after the colon
puts(p); // prints the string
相当于
strchr
然后再次执行:
,因为还有一个冒号NULL
字符串,它不会返回:
,而是存储strchr
的位置。该
下次循环执行时,不再有冒号和NULL
返回MEAS:VOLT:DC? // puts( p );
VOLT:DC? // 1. puts( ++p ); of the loop
DC? // 2. puts( ++p ); of the loop
,从而结束循环。所以输出将是:
{{1}}