指针笔记——控制组-杨越

目录

提示:这里可以添加本文要记录的大概内容阿:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、指针简介

1.指针是什么?

指针是一种特殊的变量,其中的数据储存的是内存中的某个数据的地址。

2.为什么使用指针?

我们在编写代码时,为了使程序更简便,通常会使用函数来简化程序,而由于函数读取到的是我们放入变量的值而非变量本身,因此难以在函数中对变量进行修改,所以我们利用指针内储存数据地址的特性,在函数内修改该地址指向的数据,从而间接修改变量。

同时,指针还能够有效地表示复杂的数据结构、动态分配内存、高效的使用数组和字符串。

3.指针在计算机中的大小

我们用sizeof取指针的大小(如下)

int *p;
printf("%d",sizeof(p));

可以得到在32位计算机中指针大小为4个字节(32比特)
在64位计算机中指针大小为8个字节(64比特)

二、指针的基本运用

1.指针能够储存一个变量的地址

代码如下

int i;
int *p=&i;
//或者
int *p;
p=&i;

2.*和&的作用

*和&作为运算符时
*是取该地址对应变量的值
&是取该变量的地址
因此两者运算时互逆,即&*i==i

3.通过指针间接修改地址

int i;
int *p=&i;
*p=56;//即i=56;

因此我们可以在函数中修改一个变量值,例如:

#include<stdio.h>
void change(int *a,int *b){
int k=*a;
*a=*b;
*b=k;//将两个地址中的值做交换
}
int main()
{
int n=5;
int m=8;
change(&n,&m);//输入两个变量的地址,然后在函数中交换n和m的值
//此时n==8,m==5
return 0;
}

4.const与指针

我们在声明和定义指针可以加入const来修饰指针,以此来限定指针的一部分功能,如:

int i;
int const *p=&i;//或const int *p;
int *const d=&i;

当const在 *前的时候,该指针被限制了用 *p=4之类的间接修改i的值的方法,如果想修改i,只能通过直接修改i的值的方式,亦或者新定义一个普通类型指针。
当const在 *后的时候,该指针中一旦被赋予了地址就无法改变,也就是如上图中的指针d,我们无法赋予一个新的地址给它,如p=&k之类的操作。

5.指针与数组

我们平常用的数组也是指针的一种,我们可以通过查看地址发现它们中存储的都是指向被储存的数据值的第一个,即a[0],值得一提的是数组同时也是一种*const p指针,即不能修改其中储存的地址

6.指针的运算

指针能够做加减法,但是又与我们平常的有所不同。
指针的加减法与指针的数据类型有关,

int a;
int b;
int *p=&a;
int *o=&b;
//p-o==1

1.比如说上述情况,由于一般变量是以堆栈方式储存,因此a的地址大小比b大,并且ab连续声明,所以ab地址差4个字节,int也是四个字节,所以以int的形式p和o相减得到1,此时o+1==p;(long long,char,long,double等等的加减法都和int原理相同)
2.对于数组来说&a[1]-&a[0]==1,这与一般变量不同,并不是前面的地址更大,而单个指针还是4个字节(字符串也一样,只是单个指针是1个字节)
3.指针的数据类型是k个字节的,p+n就等于p地址加k*n个字节

tip1:

void*指针的运算结果不是像上面一样经过特殊处理,其结果直接输出两个地址之间相差几个字节

指针和其所指的数据类型要保持类型一致,如果不一致的话编译会警告,继续执行可能会跳格,也就是

int a;
int b;
int c;
long long *p=&c;
//此时p+1==&a;

7.void*类型指针

void为8个字节的指针。
void *可以接受任何类型的赋值:任何类型的指针都可以直接赋值给void * 型指针,无需进行强制类型转换,但是void *赋值给其他类型指针时需要强制类型转换。
在这里插入图片描述

7.malloc函数

malloc函数可以在内存里申请一片空间malloc()括号中数字为申请的空间的字节大小
在这里插入图片描述
注意: malloc一块空间后在代码结尾要用free()还回去

8.指针嵌套

指针可以使用,char*p[ ]的形式,其指向一串字符串,比如说main中带的char const *argv[ ]就用来储存输入的多个命令(字符串)。

三、指针与字符串

1.字符串的形式及输入输出

字符串与字符数组区别在结尾有没有\0,形式有两种分别为字符串和字符串数组,也就是char *a和char a[]
在这里插入图片描述

%s可以一次输入输出一串字符(不会输出\0),为了防止输入超过界限通常会运用%8s的形式,%8s也就是只能输入8位字符。(如下)

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

2.字符串的二维数组

字符串可以用多维数组的模式,其形式为char *a[][n](n为整数且为每行字符串的长度

3.getchar和putchar

getchar和putchar可以输入和输出单个字符,如:

在这里插入图片描述

4.字符串的各种函数

字符串函数在使用前都要在添加头文件<string.h>
在这里插入图片描述

4.1字符串函数strlen

strlen函数会将输入的字符串经过处理后将第一个字符到第一个\0间的字符串长度输出。
在这里插入图片描述

4.2字符串函数strcmp

stcmp函数会同时遍历输入的两个字符串,从第一个字符开始一一比对,直到出现第一个不同的字符为止,利用ASCLL码中字符对应的数字大小来比较两个字符,若s1>s2则输出1,若s1<s2则输出-1,若s1==s2则输出0。
在这里插入图片描述

4.3字符串函数strcpy

strcpy能够将字符串s2拷贝并覆盖掉s1,
在这里插入图片描述

4.4字符串函数strcat

strcat能够把字符串s2拷贝并连接到s1后面,且s1后面的\0会被覆盖

在这里插入图片描述

4.5字符串函数strcpy,strcat,strcmp的安全形式

为了防止strcpy和strcat对s1操作时超出安全界限,我们可以添加一个安全界限size,用新的函数来操作
在这里插入图片描述
而对于strcmp来说这种,新的形式也有利于其进行更多操作。

4.6字符串函数strchr和strrchr

strchr可以搜索一个字符串中的一个字符,并将从左到右第一个出现的该字符的地址输出
在这里插入图片描述
而strrchr和strchr大致相同,只是其是从右到左搜索字符罢了。

4.7字符串函数strstr和strcasestr

strstr与strchr规则大致相同,其可以搜索一个字符串中的一个字符串,并将从左到右第一个出现的该字符串的地址输出
在这里插入图片描述
strcasestr则是无视s1大小写来搜索s1的strstr

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值