指针(详解)
1.指针基本介绍
2.什么是指针
指针是一个变量,其值为另一个变量的地址(前示意图已经说明),即,内存位置的
直接地址。就像其他变量或常量一样,在使用指针存储其他变量地址之前,对其进
行声明。指针变量声明的一般形式为:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
3.指针的算术运算
(1)指针递增操作
#include <stdio.h>
const int MAX=3;
int main(){
int var[] = {
10,100,200};
int i,*ptr;//ptr是一个int*指针
ptr = var;//ptr 指向了var数组的首地址
for(i=0;i<MAX;i++){
printf("var[%d]地址=%p \n",i,ptr);
printf("存储值:var[%d]=%d\n",i,*ptr);
ptr++;//ptr=ptr+1(1个int字节数)
}
getchar();
return 0;
}
数组在内存中是连续分布的
当对指针进行++时,指针会按照它指向的数据类型字节数大小增加,比如 int *
指针,每++ , 就增加4个字节
(2)指针递减操作
#include <stdio.h>
const int MAX=3;
int main(){
int var[] = {
10,100,200};
int i,*ptr;//ptr是一个int*指针
ptr = &var[MAX-1];//var2的地址
for(i=MAX;i>0;i--){
//反向遍历
printf("var[%d]地址=%p \n",i-1,ptr);
printf("存储值:var[%d]=%d\n",i-1,*ptr);
ptr--;//ptr=ptr+1(1个int字节数)
}
getchar();
return 0;
}
(3)指针+ -操作
#include <stdio.h>
int main () {
int var[] = {
10, 100, 200};
int i, *ptr;
ptr = var;
ptr += 2; //ptr的存储的地址 + 2个int的字节(8个字节)
printf("var[2]=%d\nvar[2]的地址=%p\nptr存储的地址=%p\nptr指向的地址的内容=%d",
var[2], &var[2], ptr, *ptr);
getchar();
return 0;
}
(4)指针的比较
指针可以用关系运算符进行比较,如 ==、< <= 和 > >=。如果 p1 和 p2 指向两个变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较, 看下面代码,说明输出什么?
4.指针数组[重点]
(1)基本介绍
要让数组的元素 指向 int 或其他数据类型的地址(指针)。可以使用指针数组
(2)指针数组定义
*数据类型 指针数组名[大小];
快速入门案例:
内存布局示意图:
(3)指针数组应用案例
请编写程序,定义一个指向字符的指针数组来存储字符串列表(四大名著书名), 并通过遍历 该指针数组,显示字符串信息 , (即:定义一个指针数组,该数组的每个元素,指向的是一个字符串)
books[0] = 三国演义
books[1] = 西游记
books[2] = 红楼梦
books[3] = 水浒传
5.指向指针的指针(多重指针)
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置(如下图)
(1)一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面
声明了一个指向 int 类型指针的指针: int **ptr; // ptr 的类型是 int **
(2) 当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符, 比如 **ptr
(3) 案例演示+内存布局图
6.传递指针(地址)给函数
当函数的形参类型是指针类型时,是使用该函数时,需要传递指针,或者地址,或者数组给该形参,举例说明
案例1:传地址或指针给指针变量
内存布局图如下:
持续更新添加。。