主要关于标识符的注意事项和指针的初步认识

一,  二维数组函数调用

输入设备---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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值