指针和数组

一、指向数组的指针(初始化)

1. 直接赋值法
char *p;
char a[] = "Hello, World!";
p = a; // p 现在指向数组 a 的第一个元素

这种方法简单直接,适用于数组已经定义并且需要一个指针来操作数组元素的情况。

2. 地址获取法

数组名代表数组首地址,即数组中第一个元素的内存地址,基于这个特性,数组名可当作指针来用


 char a[] = "Hello, World!";
 
 char *p;
 p = &a[0]; // p 指向数组 a 的第一个元素
 
 char *q;
 q = a;    // 这里的 a 表示数组 a 的首地址,与 p 同样指向数组 a 的第一个元素

这种方法通过获取数组第一个元素的地址来初始化指针,适用于需要明确表达指针指向数组第一个元素地址的场景。

二、指针与数组的关系

1. 区别:

数组名是一个地址,而指针是一个左值

2. 联系:
  • 数组名作为指针:数组名可以被当作指向数组第一个元素的指针 (因为数组名代表数组首地址,即数组中第一个元素的内存地址,基于这个特性,数组名可当作指针来用)
    指针与数组下标:指针运算与数组下标在内存中的定位是相似的,但指针运算更灵活。

三、指针初始化字符串

示例代码:
以下代码展示了如何用指针的方法初始化字符串,并使用指针的方法打印出字符数组中的每一位

#include <stdio.h>
#include <string.h>

int main(){
    char *str = "guolujie";//初始化字符数组(字符串)
    int i, length;//定义循环体中的变量、字符串长度变量
    
    length = strlen(str);//获取字符数组长度

    // 打印字符串
    for(i = 0; i < length; i++){
        printf("%c", *(str + i));
    }
    return 0;
}

四、指针的运算

  • 指针递增
    char *p = "Hello";
    
    p++; // p 现在指向 'e'
    printf("%c\n", *(p));//输出结果为e
    

指针递增操作会使指针指向下一个元素,对于字符数组,每次递增指向下一个字符。

  • 指针递减
    //在上一代码块的基础上:
      p--;
      printf("%c\n", *(p));//输出结果为H
    

指针递减操作会使指针指向前一个元素。

  • 指针算术
      char *q = p + 2; // q 指向 'l'
      printf("%c\n", *(q));//输出结果为l
      /* 或 */
      p += 2;// p 现在指向 'e'
      printf("%c\n", *(q));//输出结果为l
      //注意:此代码块的两个例子不可颠倒
    

指针算术可以用来快速跳过数组中的多个元素。

示例代码:
以下代码同上述三个例子,可以自己在编译器中运行

#include <stdio.h>

int main(){
    char *p = "Hello";

    p++; // p 现在指向 'e'
    printf("%c\n", *(p));//输出结果为e

    p--;
    printf("%c\n", *(p));//输出结果为H

    char *q = p + 2; // q 指向 'l'
    printf("%c\n", *(q));//输出结果为l
    /* 或 */
    p += 2;// p 现在指向 'e'
    printf("%c\n", *(q));//输出结果为l

    return 0;
}
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值