我试图学习指针,我写了下面的代码来打印指针的值:
#include <stdio.h>
int main(void) {
char *p = "abc";
printf("%c",*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
一个
但是,如果我将上面的代码更改为:
#include <stdio.h>
int main(void) {
char *p = "abc";
printf(p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到输出:
ABC
我不明白以下两件事:
为什么printf在第二种情况下不需要格式说明符?是否printf(pointer_name)足以打印指针的值?
根据我的理解(这很少),*p指向包含的连续内存块abc.我预计两个输出都是相同的,即
ABC
由于印刷方式不同,是不同的产出?
编辑1
此外,以下代码会产生运行时错误.为什么这样?
#include <stdio.h>
int main(void) {
char *p = "abc";
printf(*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我对这个程序很困惑,我将在这里说明.我写了两个简单的程序来打印字符串列表.首先,我创建了一个指向字符串的指针数组.这就是我尝试这样做的方式
#include <stdio.h>
int main()
{
int i = 2;
char *a[] = {"Hello", "World"};
while (--i >= 0) {
printf("%s\n", *a++); // error is here.
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我需要它打印
Hello
World
Run Code Online (Sandbox Code Playgroud)
但有编译错误,它说,
lvalue required as increment operand.
Run Code Online (Sandbox Code Playgroud)
然后我将程序更改为以下内容
#include <stdio.h>
void printout(char *a[], int n)
{
while (n-- > 0)
printf("%s\n", *a++);
}
int main()
{
int i = 2;
char *a[] = {"Hello", "World"};
printout(a,i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后它按预期工作.
我的问题是,当我将数组名称传递给函数时会发生什么不同?为什么它不能第一次工作(我怀疑"数组名称不能修改"是原因但是为什么在第二个程序中,它允许我增加)?
我知道静态变量只在程序的生命周期内初始化一次(参见此处参考).此外,静态变量在函数调用之间保持其值.然后如何修改静态变量?
例如,在以下代码段中如何修改"a":
#include <stdbool.h>
void foo(){
static int a;
printf("%d\n",a);
a++;
printf("%d\n",a);
}
int main()
{
foo();
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
相反,如何修改非静态变量?更具体地说,如何在下面的代码中修改"a"?
#include <stdbool.h>
void foo(){
int a = 2;
printf("%d\n",a);
a++;
printf("%d\n",a);
}
int main()
{
foo();
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)