1.C递归算法使用int xa(int a) { printf(%d\n,a); a; sleep(1);//先休眠再调用递归 //调用递归之前加条件 if(a 10) { xa(a); } return a; } int main(int argc,char *argv[]) { xa(1); return 0; }C指针的使用、C指针操作数组变量在创建声明的时候会指向内存地址吗 一句话核心 变量在声明、定义的时候就会分配内存就有内存地址。变量本身就是「内存地址 类型」的别名。 1. 声明 定义时发生了什么 int a 20; 编译器在栈内存 开辟 4 字节 空间 给这块空间一个地址比如 0x0012FF7C 把 20 存入这块空间 a 就是这块内存的名字 所以 a 不是数字a 是一块内存的名字 你写 a编译器自动去找它对应的地址 你写 a就是取这块内存的地址 2. 那引用 int b a; 做了什么 int b a; b 不新开内存 b 只是 a 的别名 b 和 a 共用同一块内存、同一个地址 所以 a 20 b 20 a b 地址完全一样终极总结必须背变量声明时就分配内存就有地址变量名 内存地址的别名a→ 取内存里的值a→ 取内存的地址引用b不开辟内存只是别名和原变量地址完全相同int *p; p 0; p 本身有分配内存 p 指向的目标变量没有分配内存 1. int *p; 做了什么 这是定义一个指针变量 p 系统会在栈上给 p 分配 4/8 字节内存32 位 / 64 位 p 本身有地址p 存在 所以✅ p 这个变量本身 → 有内存 2. p 0; 做了什么 C/C 中把指针赋值为 0 指针不指向任何有效内存 空指针 NULL p 自己有内存 但 p 里面存的地址是 0 0 是无效地址没有 int 变量存在这里 所以❌ p 指向的对象 → 没有内存 1. int *p; 系统在栈上给 p 分配 4/8 字节内存 p 是一个变量专门用来存「内存地址」 2. p 0; 把 地址值 0 放进 p 里面 所以p 指向了地址 0x00000000 但 地址 0 是系统保留的无效地址不能读写 3. 关键结论 p 本身有内存存在 p 里面存的内容是地址 0 p 确实指向了一个地址地址 0但这个地址非法、不能用 一句话标准答案面试这么答 *int p; p0; 指针 p 会指向内存地址 0但地址 0 是无效空地址没有可用内存。最简单总结背这个int *p定义时p 自己一定有内存栈上p0只是让 p 存地址 0不指向任何有效内存指针分两个东西指针本身p有内存*指向的目标p*P此时没有内存再对比你之前的引用你瞬间全懂int a;→ a 有内存int ba;→ b 无独立内存是别名int *p;→ p 有内存*p 不一定有