C语言 指针的内容

2023-11-10

目录

一、指针与变量

指针的含义

1.1 指针类型和指针变量

二、指针操作

三、指针与数组 

 3.1 用指针标识整型数组

3.2 指针运算

3.2.3指针数组

3.3.3 字符串指针 

四、字符串内容

4.1 单字符的输入输出

4.2 函数

4.3.1 利用指针自己写一个求长度的函数

4.3.2  写一个strcmp函数

4.3.3 写一个strcpy函数

4.3.4 写一个strcat函数


一、指针与变量

指针的含义

每个变量有它的值,同时在计算机内存中占用一块存储区,该存储区的地址就是相应变量的地址,该存储区的保存的内容就是相应变量的值。

可以认为地址和指针是同义语,变量的指针就是变量的地址,保存变量指针的变量(地址)称为指针变量。

1.1 指针类型和指针变量

T *p;//T是指针的类型.

指针类所指向的类型可以是基本数据类型(int  char float等等),也可以是构造型数据类型,指针类型,函数等;对于基本类型变量、数组成员、结构体变量、联合体变量等,用取地址符&获取变量的地址。

数组的地址与它的第一个元素(成员)的地址相同,用数组名字本身表示;函数的地址为函数的地址入口,用函数名字表示。

int x, y;
int *iptr1, *iptr2;
char *cptr;
char ch = 'a';
//编译程序根据其变量声明的先后顺序为其在内存中分配空间;
iptr1 = &x;
iptr2 = &y;//&很重要;
cptr = &ch;
x = 8;
y = 5;
cout << "*iptr1=" << *iptr1 <<endl;
cout << "*iptr2=" << *iptr2 <<endl;
cout << "*cptr=" << *cptr <<endl;
cout << "iptr1=" << iptr1 <<endl;
cout << "iptr2=" << iptr2 <<endl;
cout << "cptr=" << cptr <<endl;

输出结果:

 

指针所指变量和指针变量是两个不同的概念。指针变量即指针,它本身存储某个内存地址(某个变量的指针);指针所指变量是指针变量中所保存的内存地址对应的变量。 

 “ * ”用来访问指针所指变量的内容,称为间接引用运算符;* iptr 表示指针变量iptr所指变量的内容。

比如 int *p;//p输出地址   *p输出值

“ * ”的用法

① 放在表达式的指针变量之前,表示“对指针所指变量的访问”,称为间接引用操作符;

② 声明时表示指针类型 eg:* pi , * iptr;

二、指针操作

1、求地址“ & ”

“ & ”用来求“ 被操作对象 ”的地址(指针)。eg: &x 表示变量 x 在内存中的存储地址(即x的指针),若A的地址为ABD0,则&x 的值为ABD0。

2、取内容“ * ”

“ * ”与“ * ”互为逆运算。“ * ”运算访问地址表达式所指变量。eg : " x = * p " 是将指针p所指变量的值送入变量 x 中;“ * p = 5 ” 是将5送入指针 p 所指变量中。

3、赋值“ = ”

把一个指针赋值给某个指针变量。指针变量是指某变量指针(变量的地址)或函数的指针。

4、指向指针的指针

 如果一个变量指针所指向的变量仍是一个指针变量,就构成指向指针变量的指针变量。

三、指针与数组 

 3.1 用指针标识整型数组

数组名是数组的首地址,也就是 a[0] 的首地址;指针值也是一个地址,如果一个指针p指向数组的首地址,则 p 与 a 表示的是同一个地址。数组名是指针,指针也是数组名。可以认为数组名是常量指针。

int a[5];
int *p;
p = a;//也可以使用 p = &(a[0]);

数组名不代表整个元素的地址,只代表数组的首地址。访问数组的第 i 个元素可以用数组名也可以用指针变量,在执行 p = a 以后以下方式等价

a[i];
*(a + i);
p[i];
*(p + i);//等价 表示数组的第i个元素

指针和数组的关系

//指针与数组的关系
#include<iostream>
using namespace std;
int main() {
	int a[5];
	int i;
	int* p;
	p = a;//注意!!!!!
	for (i = 0; i < 5; i++) {
		cin >> a[i];
	}
	for (i = 0; i < 5; i++) {
		cout << "a[i] = " << a[i] << "       ";
	}
	cout << endl;
	for (i = 0; i < 5; i++) {
		cout << "*(a + i) = " << *(a + i)<< "   ";
	}
	cout << endl;
	for (i = 0; i < 5; i++) {
		cout << "*(p + i) = " << *(p + i) << "   ";
	}
	cout << endl;
	for (i = 0; i < 5; i++) {
		cout << "p[i] = " << p[i] << "       ";
	}
	cout << endl;
	for (p = a; p < a + 5; p++) {//!!!!!!!!
		cout << "*p = " << *p << "         ";
	}
	cout << endl;
	system("pause");
	return 0;
}

运行结果

3.2 指针运算

利用指针进行一些操作的时候,要注意不要存在空指针、野指针,同时注意指针进行运算过后就已经改变了,已经不是原来的值了。

利用指针时一般可以用一个新的指针去指向这个指针,对新的指针进行运算,而不改变原来的指针。

3.2.1、加运算( ++ )

如果指针值指向数组的一个元素,C语言允许对相应指针值加上一个整数表达式。把指针 p 与一个整数k相加,得到的结果仍是一个指针值,该值指向的是“数组 a 从 p 原来所指的元素开始,向数组尾部移动k个元素后的元素”。

int * p;
int a[100];
p = &(a[10]);
p = p + 3;
//此时的p所指向的是a[13];

3.2.2、减运算( -- )

与加运算类似,向数组首部移动。如果两个指针类型相容,则他们可以进行相减运算。

注意:①两个指针不能加法运算  ②函数指针和 void * 类型不可以进行加减运算

③加减运算时注意边界

3.2.3、判等和关系运算

(1)、判等( == 或 !=)或者bool类型;

(2)、关系判断(>   >=  <  <=);

#include<iostream>
using namespace std;
int main() {
	int a[50] = { 0 };
	int* ptr;
	int u = 0;
	int* q;
	ptr = &(a[4]);
	for (int i = 0; i < 50; i++) {
		a[i] = i * 10;
	}
	//① ptr++,q指向a[4],ptr指向a[5]
	q = ptr++;
	cout << "ptr++ = " << *(ptr++) << endl;
	//② *ptr++ 就是 *(ptr++) a[5]
	u = *(ptr++);
	cout << " *(ptr++) = " << *(ptr++) << endl;
	//③ (*ptr)++  *ptr所指向的变量值加一 即a[*ptr]+1  a[7]+1
	u = (*ptr)++;
	cout << "(*ptr)++ = " << (*ptr)++ << endl;
	//④ ++ptr
	q = ++ptr;
	cout << " ++ptr = " << *(++ptr) << endl;
	//⑤ *(++ptr)
	u = *(++ptr);
	cout << "*(++ptr) = " << *(++ptr) << endl;
	system("pause");
	return 0;

}

多维数组 : 行优先, 基点+行数*每行元素个数+剩余行的零头个数;

3.2.3指针数组

//由指针构成的数组
#include<iostream>
using namespace std;
int main() {
	int a[5] = { 1,2,3,4,5 };
	int *n[5];//n数组内的元素都是指针
    //指针的指针
	int** p = n;//指向n数组的首元素地址
	for (int i = 0; i < 5; i++) {
		n[i] = &(a[i]);//给n数组赋值
	}
	for (int j = 0; j < 5; j++, p++) {
		cout << **p << "  ";
	}
	cout << endl;
	system("pause");
	return 0;
}

3.3.3 字符串指针 

字符串实质上是常量字符数组,可以使用字符数组保存字符串。

①字符串指针与字符数组是不同的。

②字符串指针名字与字符串数组名字是不同的。

③字符数组名字是一个指针常量,但是字符串指针名字是一个指针变量(因为它可以指向任何字符串)

注意:数组不能整体赋值

字符数组:作为本地变量自动回收,只读

指针:这个指针可以指向任何字符串

需要处理参数或者动态分配空间(malloc)时利用指针表达字符串

char * str;
char st[20]="hello world";//正确
str="hello world";//是正确的,str是指针变量,指向常量字符串
char str1[20];//指针常量
str1[]="hello world";//错误的

四、字符串内容

4.1 单字符的输入输出

char str[20];
//读入时在vs中用scanf读入会报错,可以修改为scanf("%s",str,40);
//40并不是一个固定的值

putchar和getchar的使用

#include<iostream>
using namespace std;
int main(){
int ch;
while((ch = getchar()) != EOF){
	putchar(ch);
}
cout << "EOF" << endl;//Ctrl+c 强制终止程序运行 ,不可以输出EOF 
//Ctrl+D 程序结束运行 可以输出"EOF" 
system("pause");
return 0;
}

4.2 <string.h>函数

//主要使用的一些函数
#include<iostream>
using namespace std;
#include<string.h> 
int main() {
	char str0[30] = "hello world";
	char str1[30] = "hello";
	char str2[30] = "world";
	//①求字符串长度的函数
	int length = strlen(str0);
	cout << "length = " << length << endl;
	//②比较两个字符串字典序的函数 strcmp
	//若第二个参数字典序大于第一个参数则结果为 1 ,否则为 -1 ,相等则为0
	int result = strcmp(str1, str2);
	cout << "result = " << result << endl;
	//③将 str2 赋值给 str1 
	strcpy(str1, str2);
	cout << "str1 = " << str1 << endl;

	system("pause");
	return 0;
}

运行结果

4.3.1 利用指针自己写一个求长度的函数

#include <iostream>
using namespace std;
int mylen(char* str) {
    int count = 0;
    char* p = str;
    while (*p != '\0') {//字符串结束符'\0'
        p++;
        count++;
    }
    return count;
}

int main() {
    char str[100] = { 0 };
    cin.getline(str, sizeof(str));
    cin >> str;
    int length = mylen(str);
    cout << length << endl;
    return 0;
}

4.3.2  写一个strcmp函数

#include<iostream>
using namespace std;
#include<string.h> 
int mycmp(char* str0, char* str1) {
	int index = 0;
	//	while(str0[index]==str1[index]&&str0[index]!='\0'){
	//		index++;
	//	}
	//	*str0=*str1;
	while (*str0 == *str1 && *str0 != '\0') {
		str0++;
		str1++;
	}
	//return str0[index]-str1[index];
	return *str0 - *str1;
}
int main() {
	char str1[20] = "abc";
	char str2[20] = "abd";
	int result = mycmp(str1, str2);
	cout << result << endl;

	system("pause");
	return 0;
}

4.3.3 写一个strcpy函数

#include<iostream>
using namespace std;
#include<string.h> 
int mycpy(char* str0, char* str1) {

	while (*str1 != '\0') {
		*str0 = *str1;
		str1++;
		str0++;
	}
	*str0 = '\0';
	//return str0[index]-str1[index];
	//return *q;
}
int main() {
	char str1[30] = " ";
	char str2[30] = " ";
	gets(str2);//读入字符串
	mycpy(str1, str2);
	//cout<<*str1<<endl;//只输出第一个字母
	cout << str1 << endl;
	system("pause");
	return 0;
}

4.3.4 写一个strcat函数

//将 str1 拼接到 str0 后面
#include<iostream>
using namespace std;
#include<string.h> 
int mycat(char* str0, char* str1) {
	int i = strlen(str0);
	char* p = str0 + i;
	while (*str1 != '\0') {
		*p = *str1;
		str1++;
		p++;
	}
	*p = '\0';
}
int main() {
	char str1[30] = " ";
	char str2[30] = " ";
	gets(str1);
	gets(str2);
	mycat(str1, str2);
	//cout<<*str1<<endl;
	cout << str1 << endl;
	system("pause");
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 指针的内容 的相关文章

  • 怎么进入项目后台服务器,项目部署并常驻在服务器后台

    前言 上一次文章是自己的博客项目正式上线 这次分享 怎么让自己写好的项目常驻与服务器后台 在这之前 先了解一下服务器部署项目的一些环境依赖问题 服务器部署项目时 你的项目用到了什么环境 就要在服务器上安装相应的环境依赖 一般常要安装的就是M
  • 二进制颜色代码大全(含图)

    二进制颜色代码大全 可供大家开发时参考 FFFFFF DDDDDD AAAAAA 888888 666666 444444 000000 FFB7DD FF88C2 FF44AA FF0088 C10066 A20055 8C0044 FF
  • 如何证明凸函数的局部极小值为全局极小值

    最近上系统分析这门课的时候 老师提到了这个概念 当我们能够确定凸函数的局部最小值 这个最小值即为全局极小值 但并未给出证明 这里记录一下 主要用的还是凸函数的定义 凸函数区间任意位置的函数值小于两区间端点函数值之和
  • c#客户端Kafka的使用方法

    简介 Apache Kafka是一个分布式流处理平台 最初由LinkedIn开发 现在是Apache软件基金会的顶级项目之一 Kafka能够处理大规模的实时数据流 支持高可靠性 高可扩展性 低延迟和高吞吐量 它主要用于构建实时数据管道和流式
  • Pycharm debug 的使用

    Debug 作用的理解 若整个代码编写没有错误 且执行体没有设置断点时 Debug同正常运行模式 直接得到最终结果 当某一行代码设置断点后 在Debug模式下 代码会运行断点之前的所有程序 在断点处暂停 并在 变量窗口 可以查看所有主程序当
  • C#学习笔记:RadioButton控件与CheckBox控件的用法

    一 用途 1 RadioButton控件 单选按钮 当与其他单选按钮成对出现时 允许用户从一组选项中选择单个选项 也就是说 当同一个容器中 Form Panel GroupBox PictureBox等 存在两个以上的单选按钮时 只能有一个

随机推荐

  • C#对象和类--习题(1)

    1 一个景区根据游人的年龄收取不同价格的门票 请编写游人类 根据年龄段决定能够购买门票价格并输出 class XiTi string name int age void Xiti1 for 死循环 类似的while true Console
  • 代理模式——静态代理(贴近业务)

    静态代理概念 所谓静态也就是在程序运行前就已经存在代理类的字节码文件 代理类和委托类的关系在运行前就确定了 通常用于对原有业务逻辑的扩充 举例理解 以结婚为例 当事人只需要处理自己的主要事儿即可 比如典礼 洞房 其他的杂事儿可以交给代理公司
  • 乾坤实战教程

    一 什么是微前端架构 微前端不是单纯的前端框架或者工具 而是一套架构体系 这个概念最早在2016年底被提出 可以参考在Google上搜索Micro Frontends 排名靠前的http micro frontends org的博客文章 提
  • grpc arm 交叉编译(ubuntu 16.04)

    1 安装相关依赖工具 安装pkg config sudo apt get install pkg config 安装依赖文件 sudo apt get install autoconf automake libtool make g unz
  • Android:在争议中逃离Linux内核的GPL约束

    原文地址 http tech sina com cn s s 2012 05 28 09447177318 shtml 为这个题材起名 我思考了许久 GPL 是著名的开放源代码许可协议 Linux 内核开源项目正是在 GPL 的庇佑之下 十
  • 解读制造业数字化转型的现状及发展趋势

    智能制造系统现状 企业信息化建设三驾马车 ERP PDM与MES ERP管理的是企业的资源 比如人员 设备折旧等 PDM管理的是产品的设计过程 比如产品图纸 工艺等 MES管理的是制造的过程 比如生产计划 生产作业等 ERP是从客户开始 到
  • Python:后缀为whl的文件是什么?如何安装whl文件?

    whl格式本质上是一个压缩包 里面包含了py文件 以及经过编译的pyd文件 使得可以在不具备编译环境的情况下 选择合适自己的python环境进行安装 安装方法很简单 进入命令行输入 pip install xxxx whl 或者如果是升级
  • 有向图-邻接表

    有向图邻接表 自我感觉比邻接矩阵要理解复杂一点 但是节省的空间不是小数目 所以虽然复杂 但是我们还是要优先考虑邻接表吧 下面代码简单的写了邻接表 但是基本核心的代码全部包括了 之后图中加权的我也在代码中有所涉及 我们只要更一些参数就可以 基
  • 医学图像分辨率提高 FBPconvnet(Deep Convolutional Neural Network for Inverse Problems in Imaging 实现)

    这篇博客主要是实现论文 Deep Convolutional Neural Network for Inverse Problems in Imaging 这篇论文主要是用较少的回波信号对医学图像进行重建 用较多的回波信号进行医学图像重建
  • Source Insight 4.0 Monokai黑色主题

    比较喜欢Sublime text的Monokai主题 周末空闲时间在Source Insight上DIY一下 分享给大家 下载地址 https download csdn net download rockex 11712949 下载配置文
  • Windows server 2019搭建NFS服务器

    1 NFS服务端配置 安装服务 配置NFS共享文件夹 选择服务器和此共享的路径 选择我们创建的磁盘 创建共享名称 指定身份验证方法 设置共享权限 指定我要授权访问的主机 确认选择没有问题点击创建 可以看到我们刚才创建好的共享文件夹 2 NF
  • Linux-rpm命令-查看已安装软件包信息及未安装rpm包信息

    博文说明 前言 本文将通过个人口吻介绍rpm命令 包括查看已安装软件包信息及未安装rpm包信息 在目前时间点 2017年6月12号 下 所掌握的技术水平有限 可能会存在不少知识理解不够深入或全面 望大家指出问题共同交流 在后续工作及学习中如
  • 用Endnote在word中插入文献出现{Xu, 1997 #407}等样式的错误的解决方法如下

    1 将Instant Formatting 由Off设置为On 2 弹出的对话框 点击ignore all 参考 https blog csdn net coberup article details 82525988
  • oswatch

    作者 eygle English Version 转载时请以超链接形式标明文章 出处和作者信息及 本声明 链接 http www eygle com archives 2007 07 oracle os watcher html 站内相关文
  • Java虚拟机 -- 垃圾收集器

    介绍垃圾收集器之前先要了解三个知识点 Stop the World JVM由于要执行GC而停止应用程序的执行 任何一种GC算法中都会发生 多数GC优化通过减少Stop the world发生的时间来提高程序性能 Safepoint 安全点
  • 团队共创法成功实施的几个重点

    转自 http blog sina com cn s blog 503d1fff0101bmz3 html 团队共创法是参与的科技 Technology of Participation ToPTM 方法之一 创始於文化事业学会 Insti
  • FileInputStream(文件字节输入流)

    目录 FileInputStream 文件字节输入流 1 InputStream 常用的子类 2 FileInputStream介绍 2 1 构造方法摘要 2 2 方法摘要 2 3 应用实例 请使用FileInputStream读取 hel
  • 锐捷睿易无线网桥IP地址和WIFI密码

  • 交易信号有效性测算1——N日涨跌幅

    在交易信号发出后 我们需要一些程序化的流程 来验证信号的有效性 其中信号发出后N日的涨跌幅就是一个比较常见的任务 布林带交易策略 我们以布林带 BOLL 交易策略为示例 中轨线 N日移动平均线 上轨线 中轨线 k 标准差 下轨线 中轨线 k
  • C语言 指针的内容

    目录 一 指针与变量 指针的含义 1 1 指针类型和指针变量 二 指针操作 三 指针与数组 3 1 用指针标识整型数组 3 2 指针运算 3 2 3指针数组 3 3 3 字符串指针 四 字符串内容 4 1 单字符的输入输出 4 2 函数 4