一, 二维数组函数调用
输入设备---CPU ---输出设备
|
V
存储器
总线 -- 0101
总线的宽度
总线
(1.数据总线 2.控制总线 3.地址总线)
二,标识符 的作用域, 可见性问题
(可见性:程序运行到某个点,哪些些标识符可见(可用))
1.作用域:
局部变量:函数内部变量,在某一个{}的内部
全局变量:函数之外的变量:{}外面的,在当前文件的所有的位置
2.可见性规则:
先定义后使用
同一域中( {} ),不能有相同的标识符
不同域中,同名标识符,互不影响
不同的作用域中:内层标识符会把外层标识符屏蔽到外层的同名标识符(就近原则
时间上区分:
动态变量(声明周期)(局部变量---空间是开在栈上的--自动申请自动释放)
----------从定义语句开始,到所在的作用于范围结束
静态变量(全局变量)
----------从程序一开始就存在,直到程序结束时候销毁
注意:全局变量(静态变量)---- 也就是在{}外面,不能用变量去初始化一个变量;
静态区的变量只会初始化一次
值具有继承性
3.针对标识符一些常见的指令
auto 自动变量(一般不写,{}内默认为其)
register ---指的是cpu寄存器,意思时将变量放入寄存器里(计算速度会变快)---建议性的,主要看编译器的自身优化 (本身开空间的是取的内存的编号)--- 不能&(取地址);
extrn int a ---- 表示拓展延伸,意思是当用的变量不在这个文件,要用到别的文件的(必须是全局变量),相当于把别的文件的变量作用的域拓展到当前文件(编译的时候,要连带同编译用的文件的文件名)----- ---- exrern int a; 做声明
static----如果修饰的局部变量 --- 将局部变量储存在了全局区(静态区)
static----如果修饰的全局变量 --- 将全局变量 的作用域限定到本文件中,别的文件中不能extern了,也就是 extrn指令就不可以再调用
static ----加在函数前面, 此时效果与修饰全局变量效果一样 , 将函数作用域限定到本文件中
三,指针的初步认识:
指针的作用:可以直接控制硬件
指针的用法: 指针+数据类型 ; 指针加数组 ; 指针加函数 ; 指针+指针
指针类型是为了更好的描述地址编号的特点
指针---地址(内存单元的编号)---编号不存储,作为访问的标识
1.指针变量:
语法:基类型 * 指针变量名
------- 基类型:就是数据类型 (基本数据类型还有数组类型),表示指针变量指向的目标的数据类型
-------- * ;表示此时定义的变量 是一个指针类型的变量(放地址的变量)
指针变量名: 标识符命名 eg:int* p
int * p=&a (直接访问2
)--- 指针变量p指向了int型变量a(int a)
2.*p (*运算)的过程:
1.首先拿出p指针变量中的值(地址) 到内存中定位
2.从定位处开始,偏移出sizeof(基类型)大小的一块空间
3.把这块空间当做一个 基类型的 变量来看
3.想实现被调修改主调 :
1.想修改谁,就把谁的地址传过去
2.必须要做*运算(间接访问),实现修改
4.指针的运算:
1. &
2. * 运算数必须是指针类型的值(地址)
3. p+1 指向了下一个一基类型的数据跳过了一个基类型
4.p++
野指针 ---指向不明确 ,随机
NULL 表示 0号地址
四,二维数组再函数中调用的一些情况和指针的初步认识
1.二维数组求和
#if 0
int sumArray(int s[][5],int row) //二维数组求和
{
int i,j;
int sum=0;
for(i=0;i<row;i++)
{
for(j=0;j<5;j++)
{
sum=sum+s[i][j];
}
}
return sum;
}
int main(void)
{
int s[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int row=3;
int sum=sumArray(s,3);
printf("%d\n",sum);
return 0;
}
#endif
2.二维字符型数组比大小
char maxChars(char s[][10],int row) //二维字符型数组字符串比较大小
{
int i=0;
int ret=0;
for(i=1;i<row;i++)
{
char max[10];
strcpy(max,s[0]);
if(strcmp(max,s[i])<0)
{
strcpy(max,s[i]);
ret=i;
}
return ret; //返回的是最大字符串的下标
}
}
3.二维数组的排序
void paixuChars(char s[][10],int row) //二维数组的排序
{
int j=0;
int i=0;
for(j=1;j<row;j++)
{
for(i=0;i<row-j;i++)
{
if(strcmp(s[i],s[i+1])>0)
{
char a[10];
strcpy(a,s[i]);
strcpy(s[i],s[i+1]);
strcpy(s[i+1],a);
}
}
}
}
int main(void)
{
char s[3][10]={"hello","aello","zello"};
paixuChars(s,3);
int i=0;
for(i=0;i<3;i++)
{
puts(s[i]);
}
return 0;
}
4.指针的初步认识--被调函数改变主调函数的变量
#if 0 //指针的初步认识-被调改变主调函数的变量
int Sum(int a,int b,int *sum)
{
*sum=a+b;
}
int main (void)
{
int a;
int b;
int sum;
scanf("%d%d",&a,&b);
Sum(a,b,&sum);
printf("%d",sum);
return 0;
}
#endif
5.指针的初步认识--找出两个数中的最大值
int Compare(int a,int b,int *max,int *min) //找出两个数的最大值
{
if(a>b)
{
*max=a;
*min=b;
}else
{
*max=b;
*min=a;
}
}
int main(void)
{
int a,b;
scanf("%d%d",&a,&b);
int max=0;
int min=0;
Compare(a,b,&max,&min);
printf("max=%d min=%d\n",max,min);
}
6.指针的初步认识--两个值的交换
#if 0 //值的交换
int swap(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
}
int main(void)
{
int a=0;
int b=0;
scanf("%d%d",&a,&b);
swap(&a,&b);
printf("a=%d b=%d\n",a,b);
}
#endif
7.指针的初步认识--数组中的最大值
int maxOfArray(int *p,int len)
{
int i = 0;
int max = *(p+0); //*p
for (i = 0; i < len; ++i)
{
if (*(p+i) > max)
{
max = *(p+i);
}
}
return max;
}