C语言未提供输入/输出关键字,其输入和输出是通过标准函数库来实现的。C语言通过scanf函数读取键盘输入,键盘输入又被称为标准输入。当scanf函数读取标准输入时,如果还没有输入任何内容,那么scanf函数会被卡住(专业用语为阻塞)执行时输入10,然后回车,显示结果如上图所示。为什么第二个scanf函数不会被阻塞呢?其实是因为第二个scanf函数读取了缓冲区中的'n',即gets(p)实现了读取,打印其实输出了换行,所以不会阻塞。
解决办法:???
#define _CRT_SECURE_NO_WARNINGS #includeint main() { int i; scanf("%d", &i); char* p; p = (char*)malloc(i); char c; scanf("%c", &c);//为了去除n gets(p); puts(p); return 0; }
#define _CRT_SECURE_NO_WARNINGS #includeint main() { char* p = "hello";//把字符型常量"hello"的首地址赋给p char c[10] = "hello";//等价于strcpy(c,"hello"); c[0] = 'H';//此处可修改是因为把"hello"拷贝到了栈里,是对栈空间修改 //p[0] = 'H';//不可以对常量区数据进行修改 printf("c[0]=%cn", c[0]); printf("p[0]=%cn", p[0]); return 0; }
内存 可读 可写
常量区数据只可读,不可写。
#define _CRT_SECURE_NO_WARNINGS #include二级指针(不太重要)int main() { char* p = "hello";//把字符型常量"hello"的首地址赋给p char c[10] = "hello";//等价于strcpy(c,"hello"); c[0] = 'H';//此处可修改是因为把"hello"拷贝到了栈里,是对栈空间修改 //p[0] = 'H';//不可以对常量区数据进行修改 printf("c[0]=%cn", c[0]); printf("p[0]=%cn", p[0]); p = "world";//将字符串world的地址赋给p //c = "world";//非法,由于数组名对应的并非一个变量 puts(p); puts(c); return 0; }
二级指针的偏移考研无需掌握
#define _CRT_SECURE_NO_WARNINGS #includevoid change(int** p,int* pj) { *p = pj; } int main() { int i = 10; int j = 5; int* pi; int* pj; pi = &i; pj = &j; printf("i=%d,*pi=%d,*pj=%dn", i, *pi, *pj); change(&pi, pj); printf("after change i=%d,*pi=%d,*pj=%dn", i, *pi, *pj);//使*pi的值为5 return 0; }
函数
为什么strcpy,没有头文件也可以运行,原因是这个函数的实现是在C库中,头文件中只是声明。
func.h
#includeint printstar(int i);//函数声明 void print_message();
func.c
#include "func.h"
int printstar(int i) {
printf("*********************n" );
printf("prinstar%dn", i);
return i + 3;
}
void print_message() {
printf("how do you don");
printstar(3);
}
main.c
#include "func.h"
int main() {
int a = 10;
a = printstar(a);
print_message();
printstar(a);
return 0;
}



