一、指向数组的指针(初始化)
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;
}