注;本文仅仅是记录个人的复盘总结,还有很多的问题疏漏一些错误,也很欢迎各位大佬的点评,指正,有错误疏漏也会相应的更改学习!!(菜鸡刚学勿喷,不喜可以不用看)
1.从Hello World 学习到循环语句
1. 第一个学习了c的框架无论是什么都可以
#include <stdio.h>
int main()
{
//输入你的内容
return 0;
}
2.如何让c输出算术结果以及让c进行外界获取输入
#include<stdio.h>
int main()
{
int a; //这是个整型变量
float b; //这是个单精度浮点型变量
double c; //这是个双精度浮点型变量
printf("内容"); //这是个输出函数,f是format(格式化?或者可能是初始化)的意思
scanf("%d",&a) //scan函数用来获取用户的输入值,%d是占位符的意思,用以将用户输入的值赋予变量a同时需要在变量a前加一个&
}
3.c当中的一些运算符优先级,和表达式,赋值
4.if switch while 语句
#include<stdio.h>
int main()
{
if(//此处填写条件)
{
//此处填写满足条件需要执行的语句,包括一些嵌套循环以此类推
}
else
{
//如果说不满足if则执行此语句内容
}
switch(//填写整型变量)
{
case: //变量的值为某整数的时候:
//填写需要执行的语句
break;//一般需要加,看情况否则会执行接下来的语句。
default: // 除了以上情况才执行的:
break;
}
while(//判断是否进行循环的条件) //如果while前加do的话则先执行一次while内语句再判断是否需要继续进入循环体
{
//填写需要执行循环的语句,切记要有能跳出循环的语句
}
}
2. 从循环语句到指针变量的学习复盘
1.for循环的学习
#include<stdio.h>
int main()
{
int i;
for(i=0;i<10,i++) //for(此处是初始条件;循环的条件;循环结束后所做的)
{
//循环体内做的事情
}
return 0;
}
//到目前为止一共学习了2种循环分别是while 和for循环
//比较两者的区别,for循环类似计数器,建议在有指定次数的时候选择使用
//除此以外的其他情况可以选择while循环
2.函数的学习
函数的作用在于可以封装类似重复的代码,方便后续的问题查找和改进,优化整体的布局,同时使整个代码的布局看起来更美观整洁,也方便随时的调用,但是函数是以堆栈的方式,从main压入栈再到执行的函数压入栈,最后一个个弹出,也就是出栈。遵循LIFO(last input first out)
#include<stdio.h>
void function(void); //声明函数
int main() //主函数
{
return 0; //返回值
}
//函数类型有 int void char float double 等
// 函数类型(void),函数名称(function),()内的一般是变量的参数定义,如没有填void
//同时以下是函数的定义
void function(void) //如果说是在主函数之后的函数,需要使用的话要在开头声明。
{ //此处说明一下函数的作用域问题,在外部调用函数时,
//外部变量进入函数后参与的一些计算等是无法返回函数外的.
/*此处是函数内所执行
的语句*/
}
3.数组的学习
#include<stdio.h>
int main()
{
int a[10]; //其作用相当于定义了整型数组a并给予了10个int类型(4字节)的连续内存空间
//且下标顺序是由0-9,如a[0]-a[9],一共十个数字
int a[] = {0}; //可以将数组内的所有变量初始化为0.
int a[] = {1,2,3,4,5,6,7,8,9,}; //可以利用大括号自定义个数及变量的值.
//重点 !!
//想要遍历数组的话需要用到常用的套路就是for循环
int lenth = sizeof(a)/sizeof(a[0]); //用来获取数组长度
int t;
int i;
for(i=0,i<lenth ,i++) //i最好从零开始,i需要<lenth ,这样i刚好可以达到数组下标的最大有效值
{ //lenth = sizeof(a)/sizeof(a[0]),不论任何情况,此方法都适用求len
printf("%d",a[i]);
}
return 0;
}
此外,在数组的学习中也接触到了二维数组。
4.指针的学习
指针是一种存储地址的变量,可以说c语言的一大核心就是指针,不会指针就不算真正的学会c这门语言,接下来将通过一些基础概念和例题来理解并逐渐深入指针的内层含义,包括但不限于指针的运算和解引用以及和数组的关系。
#include <stdio.h>
int main()
{
int i;
int *p = &i; //此处是指针变量的定义,&用来获取需要记录变量的地址
//指针与数组的关系
int a[] = {1,4,5,7,8,9,}; // 数组是一种特殊指针,类似常量指针
int *p = a; //定义了一个指向数组a的首地址的整型指针
//其作用相当于记录数组a首变量地址
return 0;
}
4.1指针题目
第一题指针与数组的内存布局
#include <stdio.h>
int main() {
int arr[3] = {1, 2, 3};
int *p = arr;
printf("%d, %d\n", *p++, *++p);
return 0;
}
问题:
- 上述程序输出的结果是什么?请解释每个表达式的运作。
- 为什么会有这样的结果?
p++
和++p
的区别是什么
第二题指针与字符串数组
#include <stdio.h>
int main() {
char *arr[] = {"apple", "banana", "cherry"};
char **p = arr;
printf("%s\n", *p++);
printf("%s\n", *++p);
return 0;
}
问题:
arr
是一个什么类型的数组?它的每个元素是什么类型?*p++
和*++p
在此代码中的输出分别是什么?解释一下这两个操作的差异。
第三题函数指针和数组
#include <stdio.h>
void print_values(int arr[], int len) {
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
void (*func_ptr)(int[], int) = print_values;
func_ptr(arr, 5); // Function pointer to call print_values
return 0;
}
问题:
- 上述程序中,
func_ptr
是什么类型的指针? - 如果你将
print_values
函数的参数改为int *arr
,程序会有什么变化?为什么?
第四题动态内存与指针
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int i;
arr = (int *)malloc(5 * sizeof(int)); // 动态分配内存
if (arr == NULL) {
printf("Memory allocation failed!\n");
return -1;
}
for (i = 0; i < 5; i++) {
arr[i] = i * 10; // 填充数组
}
int *p = arr;
for (i = 0; i < 5; i++) {
printf("%d ", *(p++));
}
free(arr); // 释放内存
return 0;
}
问题:
- 动态分配内存时,
malloc
函数返回的是什么类型的指针?为什么要进行类型转换? p++
在这里的作用是什么?如果改成++p
,会有什么影响?- 如果在
free(arr)
之前没有释放arr
,会发生什么?
第五题指针数组与多维数组
#include <stdio.h>
int main() {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*p)[3] = arr;
printf("%d\n", *(*(p + 1) + 2));
return 0;
}
问题:
p
是如何定义的?它表示什么类型的指针?*(*(p + 1) + 2)
的含义是什么?为什么这个表达式能够输出6
?
一共就这些题目,这些题涵盖了指针和数组的不同方面,包括内存模型、指针运算、动态内存管理、指针与函数的关系等。对于每个问题,需要深入理解指针的使用方法和内存访问机制,掌握指针与数组之间的关系以及它们的细节差异。答案就自行思考理解了,题目本身不难,更多的对细节的把握和考量