一、指针的基本概念
1. 定义
- 指针是C语言中的一个重要概念,它是一个变量,其值为另一个变量的地址。简单来说,指针“指向”了内存中的某个位置,这个位置存放着其他变量的值。
- 例如:
c
int a = 10;
int *p; // 声明一个指向int类型的指针
p = &a; // 将指针p指向变量a的地址
- 这里 & 是取地址运算符, p = &a 表示把变量 a 的地址赋给指针 p 。
2. 指针的声明和初始化
- 声明指针的一般形式是: 类型 *指针变量名;
- 例如: float *fp; 声明了一个指向 float 类型的指针 fp 。
- 指针的初始化可以在声明时进行,也可以在声明后进行:
- 声明时初始化:
c
int x = 5;
int *px=&x;
- 声明后初始化:
c
int y = 10;
int *py;
py = &y;
二、指针的运算
1. 算术运算
- 指针的算术运算主要包括加法和减法。
- 当指针加1或减1时,它实际移动的字节数取决于它所指向的数据类型。例如,对于一个指向 int 类型(假设 int 占4个字节)的指针 p , p + 1 会使指针移动4个字节,因为它要指向下一个 int 类型的存储位置。
c
int arr[5]={1,2,3,4,5};
int *p = arr; // 此时p指向arr[0]
p++; // 此时p指向arr[1]
- 两个指针相减可以得到它们之间相隔的元素个数(前提是这两个指针指向同一个数组中的元素)。例如:
c
int arr[5]={1,2,3,4,5};
int *p1 = &arr[1];
int *p2 = &arr[3];
int diff = p2 - p1; // diff的值为2
2. 关系运算
- 指针可以进行关系运算(如 > 、 < 、 == 、 != ),通常用于比较两个指针是否指向同一个地址或者判断指针在数组中的相对位置。
- 例如:
c
int a = 10, b = 20;
int *pa=&a, *pb=&b;
if(pa < pb) {
// 如果a的地址小于b的地址,执行这里的代码
}
三、指针与数组
1. 数组名与指针的关系
- 在C语言中,数组名可以看作是一个常量指针,它指向数组的第一个元素。
- 例如:
c
int arr[5]={1,2,3,4,5};
int *p = arr; // 等价于int *p=&arr[0];
- 可以通过指针来访问数组元素:
c
int arr[5]={1,2,3,4,5};
int *p = arr;
printf("%d", *p); // 输出1,即arr[0]
printf("%d", *(p + 2));// 输出3,即arr[2]
2. 指针数组和数组指针
- 指针数组:是一个数组,其元素是指针。例如: int *arr[5]; 声明了一个包含5个元素的数组,每个元素都是指向 int 类型的指针。
- 数组指针:是一个指针,它指向一个数组。例如: int (*p)[5]; 声明了一个指针 p ,它指向一个包含5个 int 类型元素的数组。
四、指针与函数
1. 函数参数传递
- 指针可以作为函数的参数进行传递,这在C语言中常用于在函数中修改外部变量的值。
- 例如:
c
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
swap(&x, &y);
printf("x = %d, y = %d\n", x, y);
return 0;
}
- 在 swap 函数中,通过指针来交换 x 和 y 的值。
2. 函数返回指针
- 函数可以返回指针类型的值。例如:
c
int *createArray(int size) {
int *arr = (int *)malloc(size * sizeof(int));
return arr;
}
int main() {
int *p = createArray(5);
// 使用p指向的数组
free(p); // 记得释放内存
return 0;
}
- 这里 createArray 函数返回一个指向动态分配的整数数组的指针。注意,当函数返回指针时,要确保指针所指向的内存是合法有效的,并且在不需要时及时释放动态分配的内存。
标签:arr,指向,int,C语言,数组,声明,指针 From: https://blog.csdn.net/2301_81152393/article/details/144843371