在本文中,下面讨论了从数组而不是传统的 arr[i]表达式访问元素的两种独特且不同的方法。
- 使用指针*(arr+1)
- 使用一些操作i[arr]来使用数组及其背后的原因。
编译 C++ 程序时,会同时生成符号表。它的形成是为了存储程序中使用的所有变量的地址的对应值。
让我们考虑一个 C++ 程序,看看相应程序的符号表是什么:
C++
// C++ program for the above concepts
#include
using namespace std;
// Driver Code
int main()
{
// Assigning a value to a
int a = 5;
// Printing the value of a
cout << "Value of a: " << a;
// Printing the address of a
cout << "\nAddress of a: " << &a;
return 0;
}
C++
// C++ program to demonstrate the
// above approach
#include
using namespace std;
// Driver Code
int main()
{
int arr[10];
// Conventional method
// for(int i = 0; i<10; i++)
//{
// arr[i] = i+1;
//}
// Pointer Method
for (int i = 0; i < 10; i++) {
*(arr + i) = i + 1;
}
cout << "Values : ";
for (int i = 0; i < 10; i++) {
cout << *(arr + i) << ' ';
}
return 0;
}
C++
// C++ program to demonstrate the
// above approach
#include
using namespace std;
// Driver Code
int main()
{
int arr[10];
// Conventional method
// for(int i = 0; i<10; i++)
//{
// arr[i] = i+1;
//}
// Method 2
for (int i = 0; i < 10; i++) {
i[arr] = i + 1;
}
cout << "Values: ";
for (int i = 0; i < 10; i++) {
cout << i[arr] << ' ';
}
return 0;
}
输出:
Value of a: 5
Address of a: 0x7ffe25768fa4
上面程序的符号表是这样的:
Variable Name |
Address |
Value |
a |
0x7ffe58e7cc4 |
5 |
所以,从符号表可以看出,每个变量都被分配了一个地址。因此,当数组被初始化时,它也会得到一些地址。在表中,数组以指向第一个元素的指针的形式存储。
例子:
int a[10];
gets stored like:
*(a) - which points to the first element.
*(a+1) - which points to second element.
Similarly we can have the last element pointed by *(a+(n-1)) we have (n-1) as arrays in C++ have zero based indexing
使用这个概念让我们讨论访问数组的第一种方法 –
使用指针的概念
下面是实现上述概念的 C++ 程序:
C++
// C++ program to demonstrate the
// above approach
#include
using namespace std;
// Driver Code
int main()
{
int arr[10];
// Conventional method
// for(int i = 0; i<10; i++)
//{
// arr[i] = i+1;
//}
// Pointer Method
for (int i = 0; i < 10; i++) {
*(arr + i) = i + 1;
}
cout << "Values : ";
for (int i = 0; i < 10; i++) {
cout << *(arr + i) << ' ';
}
return 0;
}
输出:
Values : 1 2 3 4 5 6 7 8 9 10
有趣的方法:
正如所观察到的,数组可以用作*(arr) 。因此,可以说:
As known,
*(p + 1) is exactly the same as *(1 + p)
Therefore, *(arr + i) in above code can also be written as *(i + arr)
and basically *(arr + i) means a[i] implying,
*(i + arr) can also be written as i[a]
下面是实现上述概念的 C++ 程序:
C++
// C++ program to demonstrate the
// above approach
#include
using namespace std;
// Driver Code
int main()
{
int arr[10];
// Conventional method
// for(int i = 0; i<10; i++)
//{
// arr[i] = i+1;
//}
// Method 2
for (int i = 0; i < 10; i++) {
i[arr] = i + 1;
}
cout << "Values: ";
for (int i = 0; i < 10; i++) {
cout << i[arr] << ' ';
}
return 0;
}
输出:
Values: 1 2 3 4 5 6 7 8 9 10
想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解基础加 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程。