1.递归复习
(递归就是一层层的进行计算)
例如 求 123……*n 的值
int fun(int n)
{
if(n<=1) return 1;
else return fun(n-1)*n;
}
2.指针
1.内存地址和指针
地址:变量在内存中的位置
地址说明:
通过地址可以访问和修改变量
变量在内存中存放的地址是随机的,但是连续的几个变量在内存中的地址是连续的
变量的地址实际上是该变量在内存中第一个字节的地址
(字节、比特、变量长度请见链接字节、比特、变量)
指针:指针用来存放地址的类型
指针说明:
指针会与基本数据类型搭配使用,因为每个地址又存放不同的数据类型
指针通过地址访问和修改变量的值
指针作用:1.函数传参 2.使用堆内存
2.指针定义和使用方式
指针就是地址、指针变量用来存放地址
指针是有类型的 地址没有类型
指针定义格式:
类型 *指针变量名
int *p;//表示定义了一个名为p的短整型指针变量
针涉及到的符号:
%p 格式占位符,用于打印地址格式的格式占位符
* 解引用运算符,注意与指针定义时候的区别(详细区别请见后文)
指针与数组相关说明:
1.数组相当于指针,且数组传递时,只传递数组的首地址
2.数组只要定义,那么首地址就固定不会改变,但是指针的首地址是可以改变的
3.[]也表示解引用
4.指针加减法:
-
两个指针相加得到的值不是相加的地址,是无意义的
-
两个指针的减法可以表示两个地址之间相差了多少个地址
-
指针(数组)+1 -1可以指向下一个地址(注意 +1 -1可能存在越界问题)
-
指针可以有自加 自减运算,但是数组不行,数组是通过+1 -1的方式进行
5.通过指针改变实参值(请见后文代码实例)
6.指针与数组易混符号说明:
int *p1,*p2,*p3,*p4,n;//表示定义一个指针
int arr[10];//表示定义一个具有10短整型变量的数组
p1=arr;
p2=&arr[0];//p1与p2是相同的含义,将arr的首地址赋值给指针p
*p3=5;//表示将5赋值给指针p3,
p4=&n;//表示将n的地址赋给p4
3.拓展知识
操作系统64 or 32 说的就是指针的寻址空间
64位指针—>8个字节
32位指针—>4个字节
表示内存地址能够使用的空间
2^32个字节的内存可用,那么内存条不用超过4个G
2^64个字节的内存可用,内存条,,,起码几个T不能满足
4.代码实例
#include<stdio.h>
#include<iostream>
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
void swap2(int* px, int* py)
{
int temp;
temp = *px;
*px = *py ;
*py = temp;
}
void showArr(int arr[],int n)//实质上传递的是数组首地址,就是一个指针
{
for (int i = 0; i <n ; ++i)
{
printf("%-4d", arr[i]);
}
}
int main()
{
int y;
printf("用来说明指针的占位符是百分号P%p\n", &y);
int m;
int* p;//定义指针变量 p
p = &m;//将短整型变量y的地址赋值给指针变量p
*p = 2;//单独的* 表示解引用,左边表示将2赋值给y
int a = 3, b = 4;
swap(a, b);
printf("\n本处的输出用来说明,形参的改变无法改变实参%d%d", a, b);
swap2(&a, &b);
printf("\n本处的输出用来说明,形参的指针变量可以改变实参%d%d", a, b);
printf("\n\n用来进行数组形参传参的展示\n");
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
showArr(arr,10);
int brr[10] = { 1,2,3,4 };
printf("\n\n用来说明指针与数组之间的加减运算\n");
printf("\n地址差 %p\n", &arr[9] - &arr[4]);
printf("arr4 %p\n", &arr[4]);
printf("arr5 %p\n", &arr[5]);
printf("arr6 %p\n", &arr[6]);
printf("指针+1 %p\n", &arr[4] + 1);
printf("指针-1 %p\n", &arr[4] - 1);
system("pause");
return 0;
}