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语言 指针运算_malloc_字符串 -> 正文阅读

[C++知识库]C语言 指针运算_malloc_字符串

指针运算

  • 给一个指针加1表示要让指针指向下一个变量

    int a[10];
    int *p = a;
    *(p+1) ——> a[1]
    *(p+n) <==> a[n]	//等价
    
  • 如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义

*p++

  • 取出指针p所指的那个数据来,之后顺便把p移到下一个位置去
  • *的优先级虽然高,但是没有++高
  • 常用于数组类的连续空间操作
  • 在某些CPU上,这可以直接被翻译成一条汇编指令
#include<stdio.h>
//遍历整型数组 
int main(){
	int a[] = {1,2,3,4,5};
	int i=0;
	for(i=0;i<sizeof(a)/sizeof(a[0]);i++){
		printf("%d ",a[i]);
	}
	return 0;
}

指针的类型

  • 无论指针指向什么类型,所有的指针的大小都是一样的,因为都是地址
  • 指向不同类型数据的指针最好不要直接互相赋值,避免不必要的错误

指针的类型转换

  • void*表示不知道指向什么类型数据的指针,计算时和char*相同

  • 指针也可以强制转换类型

    int *p = &i;
    void *q = (void\*)p;
    
  • 指针的转换类型没有改变p指向的变量的类型,只是改变了指针的类型

动态分配内存

在c99之后,直接使用变量定义数组所占空间,但是在之前需要使用malloc函数申请指定大小的空间,并且使用完后要使用free释放空间(谨记)

int *a = (int*)malloc(n*sizeof(int));
free(a);

练习:使用malloc函数构建数组

#include<stdio.h>
#include<stdlib.h>
//使用malloc函数动态构建数组 
int main(){
	int n = 5;
	int i = 0;
	int s = 0;
	int *a = (int*)malloc(n*sizeof(int));
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	free(a);
	return 0;
}

练习:测试可以向系统申请的最大空间

#include<stdio.h>
#include<stdlib.h>
//测试可以向系统申请的最大空间
int main(){
	int *p;
	int c = 0;
	while((p=malloc(100*1024*1024))){	//一次循环100M 
		c++;
	}
	printf("系统最大申请空间:%dM",100*c);
	return 0;
} 

字符串

  • 以0结尾的一串字符,0和’\0’是一样的
  • 0标志字符串的结束,但它不是字符串的一部分,计算字符串的长度时不包含这个0
  • 字符串以数组的形式存在,以数组或指针的形式访问
  • string.h里有很多字符串的函数

字符串变量

  • char *str = “Hello”;
  • char word[] = “Hello”;
  • char line[10] = “Hello”;

字符串常量

  • “Hello”,它会被编译器变成一个字符数组放在某处,这个数组的长度为6,其中字符串内容占5个字节,但是结尾还有表示结束的0
  • 两个相邻的字符串常量会被自动连接起来

总结

  • C语言的字符串是以数组的形态存在的
  • 不能用运算符对字符串做运算
  • 通过数组的方式可以遍历字符串
  • C语言的字符串特殊的地方是字符串常量可以用来初始化字符数组

创建字符串

  • 使用指针创建字符串:char *s = “hello”;等价于 const char *s = “hello”;
  • 使用数组创建字符串:char s[] = “hello”;
  • 它们的区别在于,使用指针创建的字符串只能读,使用数组创建的字符串不仅可以读,而且可以修改。
#include<stdio.h>

int main(){
	char s[] = "Hello";
	printf("%c\n",s[0]);
	printf("Hello字符串的长度:%d,因为它还有末尾表示字符串的标志位0,也占一个字节",sizeof(s)/sizeof(char));
	return 0;
} 

char*是否是字符串?

  • 字符串可以用char*的形式表示
  • char*并不一定是字符串,有可能是指向字符的指针
  • 只有char*指向的字符数组有结尾的0时,才能说它所指的是字符串

字符串输入输出

char string[8];
scanf("%s",string);
printf("%s",string);

字符串可以用%s来输入和输出

#include<stdio.h>
int main(){
	char s[6];
	//scanf键盘输入
	scanf("%5s",s);
	printf("%s",s); 
	return 0;
}

安全的输入

如何避免输入的字符串数量越界问题,我们可以在%s中间加入最大字符的数量,来避免这个问题

字符串数组

两种方式

  • char a\[][10] = {"Hello","World"};
    
  • char *a[] = {"Hello","World"};
    

第一种方式是指,创建一个字符串数组,每个元素的最大长度不能超过10。

第二种方式是指,创建一个字符串数组,每个元素都是一个指向一个字符串的指针变量。

单字符输入输出

putchar

  • int putchar(int c);
    
  • 向标准输入写一个字符

  • 返回写了几个字符,EOF (-1) 表示写失败

#include<stdio.h>

int main(){
	int ch;
	while((ch = getchar())!=EOF){
		putchar(ch);
	}
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:31:54  更:2021-07-28 07:34:30 
 
开发: 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年4日历 -2024/4/29 3:23:59-

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