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语言的指针

本文为“C语言中文网>C语言入门>指针”章节的笔记。这一章内容非常丰富,前后衔接紧密,值得反复品读。

指针含义分析题01

#include <stdio.h>

int main(){
    char *string0 = "COSC1283/1284";
    char *string1 = "Programming";
    char *string2 = "Techniques";
    char *string3 = "is";
    char *string4 = "great fun";
   
    char *lines[5];
    lines[0] = string0;
    lines[1] = string1;
    lines[2] = string2;
    lines[3] = string3;
    lines[4] = string4;

    char *str1 = lines[1];
    char *str2 = *(lines + 3);
    char c1 = *(*(lines + 4) + 6);
    char c2 = (*lines + 5)[5];
    char c3 = *lines[0] + 2;

    printf("str1 = %s\n", str1);
    printf("str2 = %s\n", str2);
    printf("  c1 = %c\n", c1);
    printf("  c2 = %c\n", c2);
    printf("  c3 = %c\n", c3);

    return 0;
}

输出结果:

str1 = Programming
str2 = is
  c1 = f
  c2 = 2
  c3 = E

char *lines[5]定义了一个指针数组,它的每一个元素的类型都是char*
在表达式中使用lines时,指针数组名lines会转化为一个**char类型的指针,指向*char类型的数组元素;而数组元素本身,也是指向字符串(的首字符)的*char类型指针。
指针是可以运算的。lines表示数组的首地址,lines+0、lines+1、lines+2 … 分别表示第0、1、2 …个元素的地址,*(lines+0)lines[0]*(lines+1)lines[1]*(lines+2)lines[2] … 分别是字符串 string0, string1, string2 … 的首地址(也就是第一个字符的地址)。
注意在一些特殊情况,比如在定义时,以及使用sizeof、&时,类似*(lines+1)这样的表达式,是指代整个字符串(或者数组)的。

综上所述:
*lines == *(lines+0) == lines[0] == string0
*(lines+1) == lines[1] == string1
*(lines+2) == lines[2] == string2
...

char *str1 = lines[1]:它是一个指针,指向字符串string1,即 string1 的首地址。
char *str2 = *(lines + 3):lines + 3 为数组中第 3 个元素的地址,*(lines + 3) 为第 3 个元素的值,它是一个指针,指向字符串 string3。
char c1 = *(*(lines + 4) + 6)*(lines + 4) + 6 == lines[4] + 6 == string4 + 6,表示字符串 string4 中第 6 个字符的地址,即 f 的地址,所以 *(*(lines + 4) + 6) 就表示字符 f。
char c2 = (*lines + 5)[5]*lines + 5 为字符串 string0 中第 5 个字符的地址,即 2 的地址,(*lines + 5)[5]等价于*(*lines + 5 + 5),表示第10个字符,即 2。
char c3 = *lines[0] + 2lines[0] 为字符串 string0 中第 0 个字符的地址,即 C 的地址;*lines[0] 也就表示第 0 个字符,即字符 C。字符与整数运算,首先转换为该字符对应的 ASCII 码,然后再运算,所以 *lines[0] + 2 = 67 + 2 = 69,69 对应的字符为 E。

指针含义分析题02

原则一,运算符优先级:(从高到低)
1.定义中被括号( )括起来的那部分。
2.后缀操作符:括号( )表示这是一个函数,方括号[ ]表示这是一个数组。
3.前缀操作符:星号*表示“指向xxx的指针”。
原则二,从符号的名字开始分析。

通过这两个原则,我们就可以开始分析指针的定义:

int *p1[6];  //指针数组
int *(p2[6]);  //指针数组,和上面的形式等价
int (*p3)[6];  //二维数组指针
int (*p4)(int, int);  //函数指针

int *p1[6]:从p1开始分析。[ ]优先级比*高,所以p首先是一个有6个元素的数组。然后这个数组的元素类型是int *,即指向int类型的指针。
int *(p2[6]):从p2开始分析,比较简单,和第一个是等价的。
int (*p3)[6]:从p3开始分析。()优先级最高,所以p首先是一个指针,指向的数据类型是一个int[6]数组。
int (*p4)(int, int):从p4开始分析。()优先级最高,所以p首先是一个指针,指向int func(int, int)函数。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-07 11:51:13  更:2021-12-07 11:52:10 
 
开发: 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/24 11:09:12-

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