C++中指针的数据类型
指针是存储对象内存地址的变量。然后指针简单地“指向”对象。对象的类型必须与指针的类型相对应。指针在 C 和 C++ 中广泛用于三个主要目的:
- 在堆上分配新对象。
- 将函数传递给其他函数。
- 迭代数组或其他数据结构中的元素。
指针用于存储和管理动态分配的内存块的地址。这样的块用于存储数据对象或对象数组。大多数结构化和面向对象的语言都提供了一个内存区域,称为堆或空闲存储,从中动态分配对象。
指针的数据类型
指针是一种数据类型,它在 C 中的最纯粹形式是void * 。 void * 可以传递指针所做的内存地址,但不能取消引用。
Dereferencing means to get at the data contained at the memory location the pointer is pointing at. This means that one will know what type of data will be read from the memory.
由于void 是 nothing ,这意味着它可以指向任何包含任何类型数据的内存块。 void * 是一种受限制的类型,因为不能取消引用它,因此它不能用于指针算术。
为了让生活更轻松,C 提供了一系列派生指针类型,如 char *、int *、double * 等。无论指针指向的数据类型如何,指针都有自己的大小。
例子:
char *x – pointer to char
int *x – pointer to integer
C程序打印指针的大小:
C
// C program to print the
// size of pointer
#include
// Driver code
int main()
{
int x = 10;
int* ptr = &x;
// Print size of variable
printf("Size of variable: %zu",
sizeof x);
// Print size of pointer
printf("\nSize of pointer: %zu",
sizeof ptr);
return 0;
}
C++
// C++ program to point address
// of a pointer
#include
using namespace std;
// Driver code
int main()
{
int *ptr, var;
var = 5;
// Assign address of var
// to ptr
ptr = &var;
// Access value pointed by ptr
cout << "Value pointed by ptr: " <<
*ptr << endl;
// Address stored by ptr
cout << "Address stored at ptr: " <<
ptr << endl;
// Address of pointer ptr
cout << "Address of ptr: " <<
&ptr;
}
C
// C program to demonstrate
// dereferencing int pointer
#include
int main()
{
// Declare the integer variable
int a = 20;
// Declare the integer pointer
// variable.
int* ptr;
// Store the address of 'x' variable
// to the pointer variable 'ptr'
ptr = &a;
// value of 'x' variable is changed
// to 8 by dereferencing a pointer 'ptr'
*ptr = 8;
printf("Value of x is : %d", a);
return 0;
}
Size of variable: 4
Size of pointer: 8
打印指针地址的 C++ 程序:
C++
// C++ program to point address
// of a pointer
#include
using namespace std;
// Driver code
int main()
{
int *ptr, var;
var = 5;
// Assign address of var
// to ptr
ptr = &var;
// Access value pointed by ptr
cout << "Value pointed by ptr: " <<
*ptr << endl;
// Address stored by ptr
cout << "Address stored at ptr: " <<
ptr << endl;
// Address of pointer ptr
cout << "Address of ptr: " <<
&ptr;
}
Value pointed by ptr: 5
Address stored at ptr: 0x7ffe1c19b10c
Address of ptr: 0x7ffe1c19b110
为什么需要声明指针的数据类型?
在两种情况下需要指针的数据类型:
- 取消引用指针。
- 指针算术。
让我们详细讨论其中的每一个。
取消引用指针:
取消引用指针时需要指针的数据类型,以便知道应该读取多少数据。例如,取消引用 char 指针应该从它指向的地址读取下一个字节,而整数指针应该读取 4 个字节。
下面是演示取消引用 int 指针的 C 程序
C
// C program to demonstrate
// dereferencing int pointer
#include
int main()
{
// Declare the integer variable
int a = 20;
// Declare the integer pointer
// variable.
int* ptr;
// Store the address of 'x' variable
// to the pointer variable 'ptr'
ptr = &a;
// value of 'x' variable is changed
// to 8 by dereferencing a pointer 'ptr'
*ptr = 8;
printf("Value of x is : %d", a);
return 0;
}
指针运算:
不同类型的指针占用不同的内存量。因此,在推进指针的情况下,需要考虑类型的大小。
例子:
char takes 1 byte
char c = ‘a’;
char *ptr = &c;
ptr++;
Here, ptr++ means ptr = ptr + 1 as char takes 1 byte.
This means adding 0x01 to the address.
Similarly, for int it is 4 bytes, so ptr++ in case of int will be adding 0x04 to the address stored in the pointer.
指针数据类型是一种特殊类型的变量,仅用于存储地址,而不是值(整数、浮点数、双精度、字符等)。它知道数据存储在多少字节中。当我们增加一个指针时,我们将指针增加它指向的数据类型的大小。
让我们考虑以下内存块-
一个指针需要 8 个字节的内存来存储。在上面的内存块中-
- 如果指针“ptr”存储在 B 点(地址在 1000000-10000099 之间),没有声明指针类型(即它将存储在任何可用的位置),并且最初它指向的地址位于 2100 之间的变量-2199 那么访问它指向的变量将花费大量时间。
- 如果指针是用数据类型声明的,那么它会被存储到最接近该值的可用位置,就像存储在最接近“int”类型变量(即 4 字节行)的 A 点(地址 2200-2299),因此访问也会比较快。
因此,可以得出结论,使用数据类型声明指针的主要原因是它可以帮助节省在实现过程中访问变量的额外时间。
声明指针数据类型的意义:
- 没有数据类型的安全是无法保证的。
- 声明数据类型有助于提高访问指针指向的变量的速度。
- 编译器必须知道指针指向的内存单元的大小。
- 从指针访问结构时,必须对指针进行类型转换。