【发布时间】:2021-10-14 10:28:07
【问题描述】:
对你来说可能是一个愚蠢的问题,我找不到一个好的问题,但问题是 - 我不明白,我要求你向我解释这个概念,这样我才能理解,我将不胜感激。
所以,问题是 - 首先,我想知道为什么有那行代码:
printf("address of wsklan[0] %p\n", &wsklan[0])
会打印出不同的地址:
printf("address of wsklan[0][0] %p\n", &wsklan[0][0]);
我猜这是因为在第一种情况下,这是一个指针的地址,而在第二种情况下 - 一个 char 变量的地址。但是为什么地址不一样呢?我以为wsklan[0]的地址是第一个char的地址。
字符串是如何存储在内存中的?字符串在内存中是不是一个接一个?所以如果我输入'onetwo'和第二个字符串'threefour',它会一个接一个?
第二个问题 - 为什么我不能像这样使用 puts 函数?:
puts(wsklan+1)
但我可以这样使用它吗?
puts(wsklan[1])
完整代码sn-p:
#include <stdio.h>
#include <string.h>
char *read(char *z, int amount);
int main(void){
char data[20][300];
char * wsklan[20];
read(data[0], 300);
read(data[1], 300);
wsklan[0] = data[0];
wsklan[1] = data[1];
printf("addres wsklan[0][0] %p\n", &wsklan[0][0]);
printf("addres wsklan[1][0] %p\n", &wsklan[1][0]);
puts(wsklan[0]);
puts(wsklan[1]);
putchar(*wsklan[1]);
return 0;
}
char *read(char *z, int amount){
char * res;
int i = 0;
res = fgets(z, amount, stdin);
if(res){
while(z[i] != '\n' && z[i] != '\0')
i++;
if(z[i] != '\n')
z[i] = '\0';
else
while(getchar() != '\n')
continue;
}
return res;
}
感谢您的理解并帮助我总体上理解这个概念。那段代码 sn-p 来自 Stephen Prata 的 C 书,我稍作修改。
【问题讨论】: