第八章——地址和指针 第二节——给指针变量赋值

第八章——地址和指针 第二节——给指针变量赋值

亓翎_Re-Tikara Lv5

给指针变量赋地址值

  指针变量可以通过不同的方式获得地址值,从而指向一个具体的对象。
  指针变量获得地址值通常有以下几种办法:
.png


通过取地址运算符&

  &:表示求出变量的地址,如下:

1
2
3
int k = 1 , *q , *p;
q = &k;

说明

  • 求地址运算符&只能用于变量和数组元素。不能用于常量、表达式和register变量。

q=&(k+1); // 这种是错误的

  • &必须放在运算对象的左边,而且运算对象的基类型要与指针变量的基类型相同。
  • 在scanf()函数中,输入的每个变量之前都必须加&,就是把终端读入的数据依次放到这些地址所代表的才能出单元之中。故有以下语句等价:
    1
    2
    3
    4
    5
    6
    7
    //=======语句1=======//
    scanf("%d",&a);

    //=======语句2=======//
    q = &k;
    scanf("%d",q);


通过指针变量获得地址值

  通过赋值运算把一个指针变量中的地址赋给另外一个指针变量,从而使两个指针指向同一个地址。

1
2
3
int k = 1 , *p , *q;
q = &k;
p = q;

.png


通过标准函数获得地址

  通过调用库函数malloc和calloc在内存中开辟动态存储单元,并把所开辟的动态存储单元的地址赋给指针变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <stdlib.h>

int main() {
// 1. malloc分配内存(手动初始化)
int *p1 = (int *)malloc(sizeof(int)); // 分配单个int空间
if(p1 != NULL) { // 检查分配是否成功
*p1 = 100; // 给分配的内存赋值
printf("malloc值:%d\\n", *p1); // 输出:100
free(p1); // 用完必须释放
}

// 2. calloc分配内存(自动初始化为0)
int *p2 = (int *)calloc(3, sizeof(int)); // 分配3个int的数组
if(p2 != NULL) {
printf("calloc数组初始值:");
for(int i=0; i<3; i++) {
printf("%d ", p2[i]); // 输出:0 0 0
}
free(p2);
}

// 3. realloc扩展内存
int *p3 = (int *)malloc(2 * sizeof(int)); // 初始分配2个int
p3[0] = 1;
p3[1] = 2;

// 扩展为4个int空间
p3 = (int *)realloc(p3, 4 * sizeof(int));
if(p3 != NULL) {
p3[2] = 3; // 新增空间赋值
p3[3] = 4;

printf("\\n扩展后的数组:");
for(int i=0; i<4; i++) {
printf("%d ", p3[i]); // 输出:1 2 3 4
}
free(p3);
}

return 0;
}

malloc值:100
calloc数组初始值:0 0 0
扩展后的数组:1 2 3 4


给指针变量赋空值

  NULL是在stdio.h中定义的预定义符,代码值为0。

1
p=NULL;

  执行该语句后,p就称为空指针。上述代码等价于如下:

1
2
p=‘\0’;
p=0

说明

  • 这时p是具有一个确定的值--“空”,而不是指向地址为0的存储单元。
  • 不能通过一个空指针去访问一个存储单元时,否则会得到一个出错信息。

考点

  一个指针可以通过以下三种方式获得一个确定的地址,从而指向一个具体的对象:

  1. 通过求地址运算(&)
      求地址运算符&只能用于变量和数组元素,不能用于表达式、常量或者被说明为register的变量。且&必须放在运算对象的左边,而且运算对象的类型必须与指针变量的基类型相同。

  2. 通过指针变量获得地址值

  3. 通过标准函数获得地址值

  • 标题: 第八章——地址和指针 第二节——给指针变量赋值
  • 作者: 亓翎_Re-Tikara
  • 创建于 : 2026-02-07 02:21:28
  • 更新于 : 2026-02-10 02:48:46
  • 链接: https://re-tikara.fun/Blog/posts/f4230736/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。