跳至主要內容

6-指针

黑静美原创...大约 5 分钟编程CcppC井

使用内存

C 被设计为一种低级语言,可以轻松访问内存位置并执行与内存相关的操作。 例如,scanf()函数通过使用&符号将用户输入的值 举例:

#include <stdio.h>

int main() {
    int num;
    printf("Enter a number:");
    scanf("%d", &num);
    printf("%d", num);
    return 0;
}

&num是变量num的地址。

内存地址是以十六进制数的形式给出的。十六进制,是一个基数为 16 的数字系统,用数字 0 到 9 和字母 A 到 F(16 个字符)来表示一组四位二进制数,其值可以从 0 到 15。 读取 32 位内存的 8 位十六进制数字要比尝试破译 32 位的二进制代码容易得多。 下面的程序打印变量** i **和 **k **的内存地址:

#include <stdio.h>

void test(int k);

int main() {
    int i = 0;
    printf("The address of i is %x \n", &i);
    test(i);

    return 0;
}

void test(int k){
    printf("The address of i(in k) is %x \n", &k);
}

在 printf 语句中,%x是十六进制格式指定符。 程序输出因运行而异,但看起来类似: image.png 变量的地址从声明时起就保持不变,直到它的作用域结束。

填空,打印变量 var 的 16 进制内存地址:

int var = 42;
printf("%___", ___ var)

x &

什么是指针

指针在 C 语言编程中非常重要,因为它们可以让你轻松地处理内存位置。 指针是数组,字符串以及其他数据结构和算法的基础。 一个指针是一个变量,它包含了另一变量的地址。换句话说,它“指向”分配给另一个变量的内存位置,并可以间接第访问该变量。 指针使用号用* 声明,其形式为

pointer_type *identifier

pointer_type: 指针将指向数据类型。实际的指针的数据类型是一个16进制的数字。但是声明一个指针活动时,你必须指出它将指出什么类型的数据。 星号*声明为一个指针,应该出现在用于指针变量的标识符旁边。

下面的程序演示了变量、指针和地址:

#include <stdio.h>


#include <stdio.h>

int main() {
    int j = 63;
    int*p = NULL;
    p = &j;
    printf("The address of j is %x\n", &j);
    printf("p contains address %x\n", p);   //p在前面被赋予了指针的特性,所以这里是p指向的地址(即觉得地址)而不是改地址内的值
    printf("The value of j is %d\n", j);
    printf("p is pointing to the value %d\n", *p);//todo 解引用p
    return 0;
}

程序的输出类似于:image.png

关于这个程序,需要注意以下几点:

指针应该初始化为NULL,直到它被分配到一个有效位置。
指针可以用&来获取变量内存的一个位置
解引用

要看一个指针指向什么,再使用*,如给p赋值,再打印*p。这种情况下,*被称为间接或取消引用运算符。该过程称为解引用。

**P

⚠️注意 一些算法使用指向指针的指针。这种类型的变量声明使用 **,并且可以分配另一个指针的地址,如下所示:

int x = 12;
int *p = NULL;
int **ptr = NULL;
p = &x;
ptr = &p;
垃圾值

警告

C 语言中 int *n; 这样声明的指针 n 默认是什么? 在C语言中,当你声明一个指针变量如 int *n;它并没有被自动初始化为特定的某个值。其值是不确定的,通常被称为“垃圾值”。这意味着指针有可能指向内存任何地址。 试图在初始化前使用这样的指针(例如解引用)是危险的,并且可能导致未定义行为。

如果你试图让指针有一个初始值,你可以初始化它为NULL,这是一个特定值,表示指针不指向任何有效地址:

int *n = null;

使用 NULL 初始化指针是一个好习惯,因为你可以容易地检查一个指针是否已被赋值:

if (n == NULL) {
    // 指针还没有被赋值
}

总之,未初始化的指针在 C 中是危险的,并且在使用它们之前,你应始终确保它们被赋予一个合适的值。

——————————————————————————————————

填空,声明指针变量 ptr 指向变量 var:

int var = 42;
int ___ ptr = ___ var;

&

表达式中的指针

指针可以在表达式中使用,就像任何变量一样,算术运算符可用于指针所指向的任何对象 例如:

#include <stdio.h>

int main() {
    int x = 5;
    int y;
    int *p = NULL;
    p = &x;

    y = *p + 2; //y被赋予7
    y += *p; //y被赋予12
    *p = y; // todo x 被赋予12
    (*p)++; // x增加到13
    ++(*p); // x增加到14

    printf("p的指向值 %d\n", *p);
    printf("x的值 %d\n", x);

    return 0;
}

⚠️注意 ++运算符需要()括号才能增加所指向的值。使用--运算符时也是如此。

指针适用于哪个?

  • [ ] A. 指针是无用的,使程序员陷入噩梦
  • [x] B. 指针可以与任何变量一样在表达式中使用
  • [ ] C. 指针存储变量的值
#include <stdio.h>

void swap(int *num1, int *num2);

int main() {
    int x = 25;
    int y = 100;
    printf("x is %d, y is %d\n", x, y);
    swap(&x, &y);
    printf("x is %d, y is %d\n", x, y);
    return 0;
}

void swap(int *num1, int *num2){
    int temp;
    temp = *num1;
    *num1 = *num2;
    *num2 = temp;
}

该代码交换了变量的实际值,因为该函数使用指针地址访问它们。 输出:

x is 25, y is 100
x is 100, y is 25

下面代码的输出是哪一项?

#include <stdio.h>

void test(int *x) {
    *x += *x / 2;
}

int main() {
    int v = 8;
    test(&v);
    printf("%d", v);
}
  • [ ] A. 12
  • [x] B. 8
  • [ ] C. 4
  • [ ] D. 6
上次编辑于:
贡献者: Heijingmei
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3