我是编程新手,我试图围绕"指针"的概念。
int main()
{
int x = 5;
int *pointerToInteger = & x;
cout<<pointerToInteger;
}
为什么当我cout << pointerToInteger;
输出是十六进制值时,但是当我使用cout << *pointerToInteger;
时输出是 5 ( x=5(。
*
根据上下文具有不同的含义。
指针的声明
int* ap; // It defines ap to be a pointer to an int. void foo(int* p); // Declares function foo. // foo expects a pointer to an int as an argument.
取消引用表达式中的指针。
int i = 0; int* ap = &i; // ap points to i *ap = 10; // Indirectly sets the value of i to 10
乘法运算符。
int i = 10*20; // Needs no explanation.
一种看待它的方法是,源代码/代码中的变量,比如
int a=0;
使"int a"引用内存中的值 0。如果我们创建一个新变量,这次是一个(可能更小的("int 指针",int *
,并让它指向 &a(地址 a(
int*p_a=&a; //(`p_a` meaning pointer to `a` see Hungarian notation)
匈牙利语符号维基
我们得到p_a
指出&a
的价值是什么。您现在谈论的是a
地址上的内容,而 *p_a 是指向 &a(a 地址(的任何内容的指针。
当您想要修改内存中的值而不创建重复容器时,这很有用。
然而,p_a
本身在内存中有一个占用空间(可能小于a
本身(,当你cout<<p_a<<endl;
时,你将写入指针地址是什么,而不是那里的内容。 但是*p_a
将是&a
.
p_a
通常小于a
本身,因为它只是一个指向内存的指针,而不是值本身。这有意义吗?指针向量比值向量更容易管理,但它们在许多方面都会做同样的事情。
如果声明某种类型的变量,则还可以声明指向它的另一个变量。
例如:
int a;
int* b = &a;
所以本质上,对于每个基本类型,我们也有相应的指针类型。
例如:short
和short*
。
有两种方法可以"查看"变量b
(这可能使大多数初学者感到困惑(:
-
您可以将
b
视为类型int*
的变量。 -
您可以将
*b
视为类型int
的变量。因此,有些人会声明
int* b
,而另一些人会声明int *b
。但事实是这两个声明是相同的(空格毫无意义(。
可以使用
b
作为指向整数值的指针,也可以将*b
用作实际指向的整数值。您可以获取(读取(指向值:
int c = *b
。您可以设置(写入(指向值:
*b = 5
.
指针可以指向任何内存地址,而不仅仅是指向您之前声明的某个变量的地址。但是,在使用指针时必须小心,以便获取或设置位于指向内存地址的值。
例如:
int* a = (int*)0x8000000;
在这里,我们有指向内存地址0x8000000的变量a
。
如果此内存地址未映射到程序的内存空间中,则使用 *a
的任何读取或写入操作都很可能由于内存访问冲突而导致程序崩溃。
您可以安全地更改 a
的值,但您应该非常小心地更改 *a
的值。
是的,在声明指针变量和通过指针变量访问数据时,星号*
具有不同的含义。
int input = 7;
int *i_ptr = &input;/*Here * indicates that i_ptr is a pointer variable
Also address is assigned to i_ptr, not to *iptr*/
cout<<*i_ptr;/* now this * is fetch the data from assigned address */
cout<<i_ptr;/*it prints address */
例如,如果您声明为
int *ptr = 7;
错误(不是错误(作为指针,ptr
期望有效的地址,但您提供了constant(7)
. 直到声明没关系,但是当您像*ptr
一样取消引用它时,它会产生问题,因为它不知道data/value
7 location
是什么。因此,始终建议使用有效地址分配指针变量。例如int input = 7;
int *i_ptr = &input;
cout<<*i_ptr;
例如
char *ptr = "Hello";
=>这里*
只是通知编译器ptr
是一个pointer variable
不正常的 &&Hello
是一个char array
,即有效地址,所以这个语法是可以的。现在你可以做if(*ptr == 'H') { /*....*/ } else { /*.... */ }