指针
通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配
,没有指针是无法执行的。
声明
指针也就是内存地址,使用*
表明变量是指针类型。
c
类型标识符 *变量名;
// 这里的`类型标识符`表示指针变量指向的物理地址对应变量的数据类型。
赋值的两种方式:
注意
*
只会在声明时出现一次表示这个变量是指针变量,如果后面再对指针变量使用*
,则是取它对应地址下的值。
case:
c
#include <stdio.h>
int main() {
int var = 10;
int *p;
p = &var;
printf("address: %p\n", &var);
printf("address: %p\n", p);
printf("value: %d\n", *p);
return 0;
}
/*
output:
address: 0x16f3974e8
address: 0x16f3974e8
value: 10
*/
指针变量是用来存放内存地址
的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
c
type *var_name;
在这里,type 是指针的基类型
,它必须是一个有效的 C 数据类型
,var_name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。
但是,在这个语句中,星号是用来指定一个变量是指针。所有实际数据类型
,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的
,都是一个代表内存地址的长的十六进制数
。
INFO
如何访问指针对应物理地址的值?
c
*p
如何访问变量对应的物理地址(指针)?
c
&variable
运算
赋值运算
- 两个指针变量相互赋值
c
int a = 1, *p1 = &a, *p2;
p2 = p1;
- 将数组的首地址赋值给指针变量
c
int a[2], *p = a;
INFO
为什么可以这样赋值?
根据两个指针类型之间的赋值可知,数组变量名a是一个指针类型,默认指向首个元素。
- 将字符串的首字母地址赋值给指向字符类型的指针变量
c
char *p = "hello";
算数运算
指针支持四种算术运算:++
、--
、+
、-
。
- 指针的每一次
递增
,它其实会指向下一个元素
的存储单元。 - 指针的每一次
递减
,它都会指向前一个元素
的存储单元。 - 指针在递增和递减时
跳跃的字节数
取决于指针所指向变量数据类型长度
,比如 int 就是 4 个字节。
拓展
- 对指针的影响都会作用到变量
c
#include <stdio.h>
void add(int *p) {
*p = 100;
printf("%d", *p);
}
int main() {
int a = 1;
add(&a);
printf("%d:", a);
return 0;
}