数组越界问题、指针入门

**

一、数组的越界问题

**

阅读下面的程序,你觉得结果会是怎样的呢???

int main()
{
  int  i;
  int arr[10];
  
for( int i = 0; i<=10; i++)
   { 
       arr[i] = 0;
       printf("%d\n",i);
   }
    
   return 0;
}

运行发现会发生死循环,到底是怎么个情况

首先我们要清楚 ,在定义时 int arr[10];这 里的10表示的是数组的长度,而在使用时: arr[i] = 0;这里的i表示的是数组的下标。根据习惯,我们从0开始标记,在本题中也就是0~9。
在上面的程序中,当 i = 10; arr[i] = 0; 我们知道10已经超过了这个范围,那么,会发生什么状况呢?

局部变量( 定义在函数内部的变量)是存储在栈空间中的,即先进后出。如下图所示:
在这里插入图片描述

先定义的i, i先进入栈中,在栈底,arr[10]随后进入栈中,栈底的地址大,栈顶的地址小,要注意的是,虽然arr[0]要比arr[1]早进来,但是arr[1]永远比arr[0]的地址大
如左图:
当i 1~9时,arr[i]被赋值为0,当 i=10时,会发生溢出,数组越界,会牵涉到其邻近元素,在这个题中,数组会把i默认成10,执行arr[i] = 0后, i 变为 0,又会重新进入循环中去,发生死循环。
而事实上,数组越界的结果是难以想象的,不知道会殃及谁,不知道会发生什么,因此,在使用数组时一定要仔细,预防数组越界问题。

解决的办法:::
在Visual Studio 2012 编译器中,系统在给变量分配地址时,不会让每个变量的地址紧挨着,中间都会被2个“炸弹”隔开,因此在数组越界时,也就是i=10时,会触碰到炸弹,导致编译出错,因此来提醒我们数组发生了越界情况。

二、指针初入门

概念:
1、指针==地址

2、* 的三个作用:
(1)3*4 //乘法
(2)int *p //定义一个整型指针变量
(3)*p //解引用

3、 指针大小:与平台有关
x86或者32位平台,4字节
x64或者64位平台,8字节

4、指针的存放
通过以前的学习,我们都知道
int a = 10; //整型变量存放整型值
char b = ‘x’; //字符变量存放字符值
double c = 12.3; //浮点型变量存放浮点值

此次类推:
整型指针(地址)变量存放整型指针值
int *p=&a;

阅读下面的代码,理解每条语句的含义

 int main()
    {
     int a = 10;
     int b = 20;
     int *p = &a;
    *p = 100;//a = 100;
     p = &b;
     *p = 200;//b = 200;
      int **pp = &p;
     *pp = &a;//p = &a;
     **pp = 1000;//a = 1000;
     *pp = &b;//p = &b;
    **pp = 2000;//b = 2000;
    
return 0;
    }

在这里插入图片描述
如上图所示,整型指针变量P可以保存a的地址或b的地址,因此 *p(解引用可以得到a或b的值。

猜你喜欢

转载自blog.csdn.net/w1216702236/article/details/83120318
今日推荐