我的“C语言解惑课堂”圈子面向C语言初学者,目前圈中有我原创的C语言答疑解惑短文近300百篇,均为同学们在学习C语言过程中搞不懂的点,欢迎加鹏鸟君微信:c-poop 进圈学习哦!近段时间更新如下:
1、【第241篇】【基础解析】【两个结构体变量可以直接相互赋值吗?】
比如有如下结构体:
typedef struct student
{
int NO;
char name[10];
}STU;
现在有两个STU类型的变量stu1和stu2,已知变量stu1的成员变量如下:
STU stu1 = {1, "abc"};
那么可以直接把stu1赋值给stu2吗?其中的成员数组name也是直接拷贝过去吗?
2、【第242篇】【试题解析】【如何自己写函数实现找到一个字符串中的指定字符?】
给你一个字符串,如何从中找到指定的字符?有两个方法,一个方法是自己写函数实现,还有一个方法是使用现成的函数strchr。这一篇我们先来看看自己写函数如何实现。
3、【第243篇】【试题解析】【如何使用现成函数实现一个字符串查询指定字符?】
给你一个字符串,如何从中找到指定的字符?有两个方法,一个方法是自己写函数实现,还有一个方法是使用现成的函数strchr。这一篇我们来看看利用现有的函数strchr来实现。
4、【第244篇】【你问我答】【能把一个字符串常量拷贝给另一个字符串常量吗?】
有一位同学咨询了这么一个问题,请看以下C程序代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *pChar1 = "abcd", *pChar2 = "efg";
strcpy(pChar1, pChar2);
printf("%s\n", pChar1);
return 0;
}
编译时没问题,但是运行时却不显示任何结果,这是为啥?
5、【第245篇】【你问我答】【数组名不可以用于运算符“->”哦】
有同学问我,数组名能不能通过->运算符来引用数组元素?比如有以下程序:
#include <stdio.h>
#include <string.h>
int main(void)
{
int array[3] = {1,2,3};
int index = 0;
for(index = 0; index < 3; index++)
printf("%d ", array->index);
return 0;
}
6、【第246篇】【你问我答】【fopen打开文件后不可以再打开一次哦】
在学习到文件操作这一章时,我们都知道使用fopen函数打开一个文件后需要判断有没有打开成功,于是就有同学这样写:
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE * pFile = NULL;
pFile = fopen("./student.txt", "w");
if ( NULL == (pFile = fopen("./student.txt", "w")) ) {
puts("保存时打开文件失败!");
return ;
}
fclose(pFile);
return 0;
}
这段C程序中错在哪里了?
7、【第247篇】【试题解析】【如何把一个字符串中的小写字母转化为大写字母?】
学习C语言时,如何把一个字符串里的小写字母转换为大写字母,是一个很经典的题。我给出如下参考代码。
8、【第248篇】【试题解析】【递归实现阶乘的流程】
实现一个数的阶乘可以用递归。递归就是自己调用自己,在许多同学看来觉得有点烧脑。下面我来通过一个计算阶乘的递归程序,来看看递归的流程到底是啥样儿的!
9、【第256篇】【你问我答】【自定义函数返回数组地址为啥不可行?】
一、【提问】
我们来看下面这段C程序:
#include <stdio.h>
#include <string.h>
int* array_copy(int array1[], int len)
{
int array2[len], index = 0;
for(index = 0; index < len; index++)
{
array2[index] = array1[index];
}
return array2;
}
int main(void)
{
int array1[3] = {1, 2, 3};
int *pInt;
pInt = array_copy(array1, 3);
printf("array1[0]是 %d \n", pInt[0]);
printf("array1[1]是 %d \n", pInt[1]);
printf("array1[2]是 %d \n", pInt[2]);
return 0;
}
这段程序在函数array_copy中实现了把数组array1的元素全部复制给数组array2,然后把数组array2的地址返回给main函数的指针变量pInt,想通过pInt来输出数组array2中的元素,可是运行结果却莫名其妙!
10、【第257篇】【C语言指针】【我想到的解释指针的一个方法】
给你一个指针变量的声明:
int *pInt;
我想到一个解释的办法。
11、【第258篇】【C语言指针】【指针的指针如何指向一个字符串?】
一、问题
现在有一个指针的指针,如下:
char **ppChar = NULL;
还有一个字符串,如下:
“c-poop”,这个也是我的微信号啦!
那么如下几种写法谁对谁错,为什么呢?
ppChar = “c-poop”;
*ppChar = “c-poop”;
**ppChar = “c-poop”;
12、【第259篇】【C语言指针】【二维数组a[0]+1的1如何理解呢?】
有如下二维数组:
int a[2][2]
a[0]+1的1是什么意思呢?同学们感觉这里不好理解的原因是同学们把这个加法理解为了简单的四则运算!指针的加法千万不能理解为简单的四则运算呀!
13、【第260篇】【C语言指针】【二维数组赋值给指针哪种写法对?】
有如下二维数组:
int a[2][2]
还有如下指针变量声明:
int *pint;
那么 *pint = a[0]这种代码写法错在哪里呢?
14、【第261篇】【C语言数组】【一维数组array和&array的值是一样的,它们就是一回事儿吗?】
同学们来看看下面的代码:
#include<stdio.h>
int main(void)
{
int array[3] = {1, 2, 3};
printf("array 是: %x\n", array);
printf("&array 是: %x\n", &array);
return 0;
}
再输出&array和array时,结果是一样的,见附图。那么它们就是一回事儿吗?
15、【第262篇】【C语言基础】【C语言运算符优先级记不住咋办?】
C语言里的运算符众多,并且各自还有优先级,这么多的运算符优先级根本就记不住啊!其实鹏鸟君自己都记不住,那咋办?教你一招。
16、【第263篇】【C语言基础】【int类型的变量前面加个*是什么意思?】
有同学们提出下面一个题:
int param = 123;
int *pint = ¶m;
那么*param的意思是啥?
17、【第265篇】【C语言二维数组】【声明二维数组时初始化不当,导致程序一运行就退出!】
有同学问我一个关于二维数组一个很奇怪的问题,于是我写了一个C程序来模拟这个奇怪的问题,代码见附图1。这个程序很简单,就是输入一个3*3的二维数组的元素。我开开心心地输入了以下元素:
1 2 3
4 5 6
7
就在我输完了7,准备输入8的时候,C程序突然退出了,见附图2.这是为啥呢?
18、【第266篇】【C语言基础】【变量声明时未赋初始值,然后程序莫名其妙退出,你造吗?】
一、 C程序运行到一半莫名其妙退出
有同学问了我一个奇怪的问题,说C程序运行的好好的,突然就退出了!根据这位同学的描述,我写了一个C程序来重现这个奇怪的场景,C程序代码见附图1.
这个C程序很简单,先往c:\\student.txt这个文件写入两行数据,然后再从c:\\student.txt读出这两行数据,并且放在数组shuzu中。读取函数是fread,可是执行到:
fread(&shuzu[index], sizeof(STU), 1, pFile);
这一行时,C程序突然退出了!
19、【第267篇】【C语言指针】【指针未初始化会导致奇怪的问题?】
C语言一些教程有时候在声明指针时没有初始化,这是一个不太好的做法,会导致一些奇怪的问题。我写了一段C程序,如下:
#include<stdio.h>
int main(void)
{
int param = 1;
int *pInt;
*pInt = param;
printf("param的值是: %d\n", *pInt);
return 0;
}
这段程序很简单,我声明指针pInt时没有初始化,后面就把变量param赋值给*pInt了,我的意图就是想通过指针pInt输出param的值。
我想同学们很多人都这么写过吧,然后一运行,程序挂了!
20、【第269篇】【C语言基础】【转义字符后跟16进制数是一个字符哦】
有同学问如下C程序代码:
#include <stdio.h>
#include <string.h>
int main()
{
char array[] = "123\x11\0";
printf("字符数组有 %d 个字符\n", strlen(array));
return 0;
}
最后输出不应该是6吗?因为字符数组array有6个字符啊,分别是1、2、3、x、1、1啊,可是输出的结果却是4,如附图所示,这是为啥呢?
21、【第270篇】【C语言基础】【局部变量和全局变量有啥区别?】
有同学问这个“局部变量”和“全局变量”有啥区别呢?
这个很简单啊,除了static之外,一个区别就是局部变量就是在一个局部定义的变量,全局变量就是在程序开头处定义的变量,比如如下C程序代码:
#include <stdio.h>
int global = 123;
int main()
{
int param1 = 456;
{
int param2 = 789;
printf("param2: %d\n", param2);
}
printf("global: %d\n", global);
printf("param1: %d\n", param1);
printf("param2: %d\n", param2);
return 0;
}
最后我想通过printf函数输出这三者,结果编译器报错了,错误如附图所示,这是为啥?