给指针变量赋值,可以是字符串,也可以是字符数组,前者可读不可写,后者可读写
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
//相当于将数据放在公共区域 const类型变量,可读不可写
char* p = "hello"; // 把字符串类型的常量 "hello" 的首地址赋值给 p
char c[6] = "hello"; // 等价于 strcpy(c, "hello") 本质是将数据拷贝到栈空间,而栈空间是可读可写的
c[0] = 'H';
p[0] = 'H'; // 不可以对常量去数据进行修改
printf("c[0] = %c\n", c[0]);
printf("p[0] = %c\n", p[0]);
p = "world"; // 将字符串 world 的地址赋值给 p
//c = "world"; // 非法
return 0;
}
二级指针
一级指针取地址,二级指针取地址的地址,也就是说一级指针就像藏宝图,找到藏宝图就保存了宝贝的地址,而二级指针相当于指示藏宝图地址的碎片;在画江湖里面,一级指针就是指向龙脉的藏宝图,二级指针就是指向藏宝图的温韬;
二级指针的初始化,一定是某个一级指针的地址;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void change(int** p, int* pj);
void change(int** p, int* pj)
{
int i = 5;
// 对 p:二级指针解引用,得到一级指针 pi指向变量的地址
// pj 是指向 变量5 的地址的指针,将该指针指向解引用后的二级指针,修改指针的直接指向
*p = pj; // 将 pj 的值,赋值给 p
}
/// 这部分对于考研不重要,记忆一下即可,初试和机试都不用
/// 想要在子函数中改变一个变量的值,必须把该变量的地址传进去
/// 想要在子函数中改变一个指针变量的值,必须把该指针变量的值传进去
int main() {
int i = 10;
int j = 5;
int* pi;
int* pj;
pi = &i;
pj = &j;
printf("i = %d, *pi = %d, *pj = %d¥\n", i, *pi, *pj); // i & *pi都是10,*pj是5
// 第一个参数:接受二级指针【地址】, 其值为一级指针【指向数值10的指针】的地址
// 第二个参数:接受一级指针:其指向数值5的地址;
change(&pi, pj);
printf("after change i = %d, *pi = %d, *pj = %d¥\n", i, *pi, *pj);
return 0;
}
函数声明,定义与调用
全局变量
定义在函数中的形参,如果没有函数调用,那么并不占用内存中的存储单元。只有函数发生函数调用时,函数print
中的形参才会被分配内存空间
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int i = 10; // 定义全局变量
void print(int a);
void print(int a)
{
printf("print i = %d\n", i);
}
int main() {
printf("main i = %d$\n", i);
i = 5; // 局部变量修改全局变量,并且将其传入子函数中
print(i);
return 0;
}
递归调用
我调用我自己
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int recursion(int k);
int recursion(int k)
{
if (k == 1)
{
return 1;
}
if (k > 69)
{
printf("you can only input value among of 0 ~ 69");
exit(1);
}
return k * recursion(k - 1);
}
int main() {
int n;
scanf_s("%d", &n);
printf("the value of input = %d\n", n);
int result = recursion(n);
printf("factorial = %d\n", result);
exit(0);
}