C语言第八次课重点(指针;值传递;指针+1;指针对内存的解析;指针与const关键字;数组名;)
(1)回顾指针
交换a,b的值
#include<stdio.h>
void Swap_Int(int a, int b)//形参
{
int tmp = a;//自定义函数名tmp
a = b;
b = tmp;
}
int main()
{
int x = 10; int y = 20;
printf("x=%d y=%d /n,x,y");
Swap_Int( x, y); // 实参
printf("x=%d y=%d /n,x,y");
return 0;
}
//形参的改变不会改变实参的值;单向传递从实参到形参。
值传递
指针的应用
//定义指针时未进行初始化:叫做“野指针”。赋空值int*p=NULL;叫做“空指针”。
例题:
#include<stdio.h>
void fun(int *p)
{
int a = 200;
*p = 100;
p = &a;
}
int main()
{
int x = 0;
int* s = &x;
fun(s);
printf("%d %d\n", x, *s);
return 0;
}
//打印 x=100 *s=100;
数组【】=type+num
只有在sizeof(ar)中 代表整个数组概念,其他情况下数组名退化成数组首元素的地址 ar等价于&ar【0】;
指针+1的影响:
//整型指针+1 地址每次加4字节
//char类型指针+1,地址每次加1字节。
//double类型+1,地址每次加8字节。
//按类型大小sizeof()*1
例题:
指针的类型对指针有两个限制;
(1)限制指针+1的能力;
(2)限制指针对内存的解析能力;
指针对内存的解析能力:
//图为限制指针的内存解析能力并且指针不能相加只能相减。
指针减去指针得他们的元素个数
图为解析“指针-指针”:
总结:指针相减
指针与const关键字:
//const只封锁“写”的能力。
(2)数组名
//数组名被看做是数组第一个元素的首地址,只有在sizeof中被看做所占内存大小。
//ar[ i ];等价于*(ar+i);当i等于0时访问首元素;当i等于1时偏移访问下一个元素,以此类推。在汇编中称其为“畸变式访问形式”。
数组名的退化:在形参中定义数组退化成指针。时间效率空间效率高。
#include<stdio.h>
#include<typeinfo>
using namespace std;
void Print_Ar(int br[5])//形参中定义数组将退化为指针void Print_Ar(int*br)
{
printf("%d \n", sizeof(br));
printf("%d \n", typeid(br).name);
int cr[5];
printf("%d \n", sizeof(cr).name);
printf("%d \n", typeid(cr).name);
}
int main()
{
int ar[5] = { 12,23,34,45,56 };
Print_Ar(ar);
return 0;
}