IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言 指针综合 -> 正文阅读

[C++知识库]C语言 指针综合

目录

一、什么是指针

二、地址和指针的概念

2.1 变量与地址

2.2 指针的定义

2.3 指针变量的初始化

三、指针与一维数组

四、指针运算

五、字符串与指针

六、指针与二维数组

七、指针数组


一、什么是指针

C语言中指针是一种数据类型,指针是存放数据的内存单元地址。

计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节,为了便于管理,必须为每个存储单元编号,该编号就是存储单元的“地址”,每个存储单元拥有一个唯一的地址。

指针变量除了可以存放变量的地址外,还可以存放其他数据的地址,例如可以存放数组和函数的地址。

二、地址和指针的概念

🏷?含义:

变量定义类型表示含义
int i;int定义整型变量 i
int *p;int *定义p为指向整型数据的指针变量
int a[5];int [5]定义整型数组a,它有5个元素
int *p[4];int *[4]定义指针数组p,它由4个指向整型数据的指针元素组成
int (*p)[4];int (*)[4]p为指向包含4个元素的一维数组的指针变量
int f();int ()f为返回整型函数值的函数
int *p();int *()p为返回一个指针的函数,该指针指向整型数据
int (*p)();int (*)()p为指向函数的指针,该函数返回一个整型值
int **p;int **p是一个指针变量 ,它指向一个指向整型数据的指针变量(二级指针)
void *p;void *p是一个指针变量,基类型为void(空类型),不指向具体的对象

2.1 变量与地址

2.2 指针的定义

定义指针变量的一般形式为:数据类型 *指针变量名[=初始地址值];

功能:定义指向“数据类型符”的变量或数组的指针变量,同时为其赋初值。

📝例如:int *p;

🗯?解释:

  1. p是变量的名字,p变量的数据类型是int *
  2. 所谓int *类型,实际就是存放int变量地址的类型。
  3. int *表示p变量存放的是int类型变量的地址。不表示定义了一根名字叫做* p的变量。
  4. double *p;? ? ? ? ?char *p;

2.3 指针变量的初始化

一般形式: <类型标识符> *<标识符>=初始地址值;

📝例:输入两个数,并使其从大到小输出。

main()
{
    int *p1,*p2,*p,a,b;
    scanf("%d,%d",&a,&b);
    p1=&a;p2=&b;
    if(a<b)
    {
        p=p1;p1=p2;p2=p;    
    }
    printf("a=%d,b=%d\n",a,b);
    printf("max=%d,min=%d\n",*p1,*p2);
}

三、指针与一维数组

一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。

所谓数组元素的指针就是数组元素的地址

  • 💠下标与指针的关系
  • 💠数组名

🏷?引用一个数组元素,可以用:

(1)下标法,如a [i] 形式;

(2)指针法,如*(a+i)或*(p+i)

其中a是数组名,p是指向数组元素的指针变量,其初值p=a。

📝例:输出数组中的全部元素

假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法:

(1)下标法

#include <stdio.h>
void main()
{
  int a[10];
  int i;
  for(i = 0; i < 10; i++)
    scanf("%d", &a[i]);
    printf("\n");
  for(i = 0; i < 10; i++)
    printf("%d", a[i]);
}

(2)通过数组名计算数组元素地址,找出元素的值。

#include <stdio.h>
void main()
{
  int a[10];
  int i;
  for(i = 0; i < 10; i++)
    scanf("%d", &a[i]);
    printf("\n");
  for(i = 0; i < 10; i++)
    printf("%d", *(a + i));
}

通过指针变量输出a数组的10个元素。

#include <stdio.h>
void main()
{
  int * p, i, a[10];
  p = a;
  for(i = 0; i < 10; i++)
  scanf("%d", p++);
  printf("\n");
  p = a;
  for(i = 0; i < 10; i++, p++)
  printf("%d", * p);
}

🏷?拓展:

四、指针运算

(1)指针变量赋值

将一个变量地址赋给一个指针变量。如:

p=&a; //将变量a的地址赋给p

p=array; //将数组array首元素地址赋给p

p=&array[i]; //将数组array第i个元素的地址赋给p

p1=p2; //p1和p2都是指针变量,将p2的值赋给p1

(2)指针变量加(减)一个整数

例如: p++、p--、p+i、p-i、p+=1、p-=i等。

  • p+=i(p指向当前对象后第i个对象)
  • p-=i(p指向当前对象前第i个对象)
  • p++(p指向下一个对象)
  • p--(p指向前一个对象)
  • p+i(当前对象后第i个对象)
  • p-i(当前对象前第i个对象)
  • 若p1与p2指向同一数组(p1>p2),

? ? ? ? p1-p2==两指针间元素个数

? ? ? ? p1+p2 无意义

(3)两个指针变量比较

指针变量的关系运算:

? ? ? ?若p1和p2指向同一数组,则可以进行比较

? ? ? ? ? ? ? ?p1<p2? ? ?表示p1指的元素在前

? ? ? ? ? ? ? ?p1>p2? ? ?表示p2指的元素在后

? ? ? ? ? ? ? ?p1==p2? ?表示p1与p2指向同一元素

? ? ? ?若p1与p2不指向同一元素,比较无意义

? ? ? ?p == NULL 或 p != NULL

(4)指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:p=NULL;

五、字符串与指针

字符串的表示形式

(1)用字符数组存放一个字符串,然后输出该字符串。

定义一个字符数组,对它初始化,然后输出该字符串定义一个字符数组,对它初始化,然后输出该字符串。

用字符数组实现:

(2)用字符指针指向一个字符串

可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。

用字符指针实现:

🏷?用字符数组和字符指针变量实现字符串的存储和运算之间的区别,主要有以下几点:

? 1.?字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。

? 2. 赋值方式。

? ? ??

? ?3. 对字符指针变量赋初值:

? ? ? ?

? ? 4. 指针变量的值是可以改变的。

六、指针与二维数组

(1)二维数组的地址

例如:int a[3][4];

① 二维数组名a是数组的首地址

② 二维数组a包含三个行元素:a[0]、a[1]、a[2]

a[0]、a[1]、a[2] 是一维数组名,也是一维数组的首地址。

(2)二维数组元素的地址

a[i][j]的地址可以用以下3种方式表示:

&a[i][j]、a[i][j]、*(a+i)+j

(3)二维数组元素的表示法

数组元素可用下列形式表示:

a[i][j]、*(a[i]+j)、*(*(a+i)+j)

(4)指向二维数组元素的指针变量

与指向一维数组元素的指针变量是相同的,用它存放二维数组元素的地址。

七、指针数组

指针数组定义的一般形式:

? ? ? ? ?数据类型 *指针数组名 [元素个数];

在这个定义中由于“ [ ] ” 比 “ * ” 的优先级高,所以数组名先与 “ [元素个数] ” 结合,形成数组的定义形式,“ * ” 表示数组中每个元素是指针类型, “数组类型标识符” 说明指针的目标变量的数据类型。

例如:

int? *p[3];

char? *cp[5];

📝例题:

#include "stdio.h"

main()
{
   int a[]={20, 40, 60, 80, 100};
   int *p;

   p=a+1;
   //printf("%d\n", *(p+1));      //60   输出p的下一个, 60
   //printf("%d\n", *p+1);        //41   *p取出40,值再加1...41
   //printf("%d\n", *(p++));      //40   先取*p的值,再使指针p加1
                                        //再执行printf("%d", p); 就会输出60
   //printf("%d\n", *p++);        //40   同上
   //printf("%d\n", *(++p));      //60   先使p自加,再进行*运算
   //printf("%d\n", *--p);        //20   先使p自减,再进行*运算
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:35:33  更:2022-10-31 11:37:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:29:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码