指针

本文最后更新于:2023年12月5日 晚上

每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。

#include <stdio.h>

int main ()
{
   int  var1;
   char var2[10];

   printf("var1 变量的地址: %p\n", &var1  );
   printf("var2 变量的地址: %p\n", &var2  );

   return 0;
}

结果:

var1 变量的地址: 0x7fff5cc109d4
var2 变量的地址: 0x7fff5cc109de

如何使用指针

#include <stdio.h>

int main ()
{
   int  var = 20;   /* 实际变量的声明 */
   int  *ip;        /* 指针变量的声明 */

   ip = &var;  /* 在指针变量中存储 var 的地址 */

   printf("Address of var variable: %p\n", &var  );

   /* 在指针变量中存储的地址 */
   printf("Address stored in ip variable: %p\n", ip );

   /* 使用指针访问值 */
   printf("Value of *ip variable: %d\n", *ip );

   return 0;
}

结果:

Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20

结构体指针

#include <stdio.h>
struct house {
    char location[20];
    float area;
    int price;
};
int main() {
    struct house kangqiao = {'昌邑', 132.0, 5000};  # 位置、面积、价格
    struct house * h;  # 定义指针h
    h = &kangqiao   # 给指针h赋值
    printf("location=%s\n", (*h).location);  # 打印location
    # (*h).location、h->location、kangqiao.location 这三种写法是等价的
    return 0;
}

数组指针

#include <stdio.h>
int main() {
 int arr[] = {1,2,3,4};
    int * p = arr;  # 现在p指向arr第一个元素也就是arr[1]的地址
    p++;      # 现在p向后移动一位,指向arr的下一个元素,也就是arr[2]
    # int * p = arr; p++; 这种写法等价与 int * p = arr + 1
    return 0;
}

int p = arr; p++; 这种写法等价与 int p = arr + 1

字符串数组

C 语言规定数组代表数组所在内存位置的首地址,也就是 str[0]的地址,即 str=&str[0];

而 printf(“%s\n”, str); 为什么用首地址就可以输出字符串。

因为还有一个关键,在 C 语言中字符串常量的本质其实是一个地址,这个是许多初学者比较难理解的问题。


指针
http://blog.lujinkai.cn/C/指针/
作者
像方便面一样的男子
发布于
2020年12月11日
更新于
2023年12月5日
许可协议