C语言——指针(详解)

指针(详解)

1.指针基本介绍


image-20221030161854436


2.什么是指针


指针是一个变量,其值为另一个变量的地址(前示意图已经说明),即,内存位置的

直接地址。就像其他变量或常量一样,在使用指针存储其他变量地址之前,对其进

行声明。指针变量声明的一般形式为:

int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */

image-20221030162354356


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;
}

image-20221030162613746

数组在内存中是连续分布的
当对指针进行++时,指针会按照它指向的数据类型字节数大小增加,比如 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;
}

image-20221030162757417

(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; 
}

image-20221030163301962

(4)指针的比较

指针可以用关系运算符进行比较,如 ==、< <= 和 > >=。如果 p1 和 p2 指向两个变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较, 看下面代码,说明输出什么?

image-20221030173032604


4.指针数组[重点]

(1)基本介绍

要让数组的元素 指向 int 或其他数据类型的地址(指针)。可以使用指针数组

(2)指针数组定义

*数据类型 指针数组名[大小];

快速入门案例:


image-20221030174620262

内存布局示意图:

image-20221030174735705


(3)指针数组应用案例

请编写程序,定义一个指向字符的指针数组来存储字符串列表(四大名著书名), 并通过遍历 该指针数组,显示字符串信息 , (即:定义一个指针数组,该数组的每个元素,指向的是一个字符串)

books[0] = 三国演义
books[1] = 西游记
books[2] = 红楼梦
books[3] = 水浒传

image-20221030212345016

5.指向指针的指针(多重指针)

指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置(如下图)

image-20221030213421016

(1)一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面
声明了一个指向 int 类型指针的指针: int **ptr; // ptr 的类型是 int **

(2) 当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符, 比如 **ptr

(3) 案例演示+内存布局图

image-20221030222521463

image-20221030223557477

6.传递指针(地址)给函数

当函数的形参类型是指针类型时,是使用该函数时,需要传递指针,或者地址,或者数组给该形参,举例说明

案例1:传地址或指针给指针变量

image-20221030225716588

内存布局图如下:

image-20221030225645267

持续更新添加。。

猜你喜欢

转载自blog.csdn.net/m0_53415522/article/details/127607200