21年4月15分支循环函数(二)

1.数组的访问

2. while中数组越界问题

1.数组的访问

1.1

int ar[10]={0};

这里不能对数组名直接++, 比如 ar++ ,这就是错误的

因为ar是一个常量,表示的是数组首地址不能改变

 

1.2  下标访问  最后都转换成  指针访问

ar[ i ]  =>   *( ar+i )

i[ ar ]  =>   *( i+ar )

这两个语句是等价

 

 

2. while中数组越界问题

int FindValue(int* br, int n, int value)
{
  assert(br != nullptr && n > 0);
  int i = n - 1; 
  while (i >= 0 && (value != br[i]))
  {
    i--;
  }
return i;

}
while (value != br[i] && i >= 0  )  {  i--; }
这一句有什么问题?
当 i 值是 1 的时候,满足条件,执行完后i为0
当 i 值是 0 的时候,满足条件,执行完后i为-1

这个时候,问题来了:
value != br[-1]  在&&前面,也就是会先对值进行比较,再判断。
不管最后是真是假,这里对 br[-1] 进行访问就是越界,这个内存是不该被访问的,造成的后果是无法预测的。

修正:
while (i >= 0 && (value != br[i])) 就可以了
因为是&&,前面关于下标的判断为假后,后面就不执行了。 这样就避免了越界。
 

int main()
{
  int value = 0;
  int arr[10] = {12,23,34,45,56,67,78,89,90,100};
  scanf_s("%d",&value);
  printf("下标是 %d", FindValue(arr, 10, value));
}

 

posted @ 2021-04-15 20:16  没壳的蜗牛  阅读(49)  评论(0编辑  收藏  举报