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));
}