目录
- 符号
- *
- 1、声明指针变量
- 2、获取指针变量的值
- 3、修改指针变量所指向的值
- 4、作为运算符使用
- &(地址运算符)
- 1、获取变量的地址
- 2、作为位运算符使用
- 3、作为逻辑运算符使用
- 问题
- *p代表的是一个值
符号
*用于指针变量的操作,它的作用有:
1、声明指针变量;
2、获取指针变量的值;
3、修改指针变量所指向的值;
4、作为运算符使用。
& 用于获取变量的地址,它的作用有:
1、获取变量的地址;
2、作为位运算符使用;
3、作为逻辑运算符使用。
在 C 语言中,* 和 & 是两个常用的操作符,它们分别表示指针运算符和地址运算符。
*
1、声明指针变量
在 C 语言中,可以使用 * 来声明一个指针变量,例如:
int *p;
这个语句定义了一个名为 p 的指针变量,它可以指向一个 int 类型的变量。
2、获取指针变量的值
可以使用 * 来获取一个指针变量所指向的地址上的值,例如:
int a = 10;
int *p = &a;
printf(“%d\n”, *p);
这个程序会输出 10,因为 *p 表示获取 p 所指向地址上的值,即 a 的值。
3、修改指针变量所指向的值
可以使用 * 来修改一个指针变量所指向的地址上的值,例如:
int a = 10;
int *p = &a;
*p = 20;
printf(“%d\n”, a);
这个程序会输出 20,因为 *p = 20 表示将 p 所指向地址上的值修改为 20,即将 a 的值修改为 20。
4、作为运算符使用
运算符也可以作为乘法运算符使用,例如:
int a = 2, b = 3;
int c = a * b;
这个程序会将 a 和 b 相乘的结果赋值给 c。
&(地址运算符)
& 是 C 语言中的一个运算符,用于获取变量的地址。它可以用于以下几种情况:
1、获取变量的地址
可以使用 & 来获取一个变量的地址,例如:
int a = 10;
int *p = &a;
这个程序中,&a 表示获取变量 a 的地址,然后将这个地址赋值给指针变量 p。
2、作为位运算符使用
& 运算符还可以作为位与运算符使用,例如:
int a = 3, b = 5; int c = a & b;
这个程序会将 a 和 b 的二进制位进行按位与运算,然后将结果赋值给 c。
3、作为逻辑运算符使用
& 运算符还可以作为逻辑与运算符使用,例如:
int a = 3, b = 5;
int c = (a > 2) & (b < 4);
这个程序中,(a > 2) & (b < 4) 表示将 a > 2 和 b < 4 的结果进行逻辑与运算,然后将结果赋值给 c。
问题
*p代表的是一个值
*p代表的是一个值
p = &a; 和 *p = &a; 在C语言中有非常大的区别,它们是完全不同的操作,下面是它们各自的含义:
p = &a;
这行代码是将变量a的地址赋值给指针p。此时,p指向了a的存储位置。你可以通过解引用p(即使用*p)来访问或修改a的值。
*p = &a;
这行代码尝试将变量a的地址赋值给指针p所指向的内存位置。但是,这里有几个问题:
如果p没有事先被初始化为指向一个有效的、可以写入的内存地址,那么这行代码会导致未定义行为,通常是段错误(segmentation fault),因为你在尝试写入一个随机的或未分配的内存地址。
即使p已经指向了一个有效的内存地址,这行代码也是错误的,因为*p代表的是一个值,而不是一个地址。你不能将地址赋值给一个值。*p应该是一个与p指向类型相同的值(在这个例子中是int类型的值),而不是一个地址。
总结来说,p = &a; 是正确的,用于将指针p指向变量a的地址;而 *p = &a; 是错误的,因为试图将一个地址赋值给指针所指向的值,这在C语言中是不允许的。正确的做法应该是先确保p指向一个有效的内存地址,然后再对*p进行赋值操作,但赋的值应该是一个与p指向类型相同的值,而不是地址。