您现在的位置是:首页 >技术杂谈 >c/c++:指针p+p-p*p/,数组&a+1,指针减指针,指针实现strlen函数,指针的比较运算,指针数组,多级指针网站首页技术杂谈
c/c++:指针p+p-p*p/,数组&a+1,指针减指针,指针实现strlen函数,指针的比较运算,指针数组,多级指针
c++:
2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c++的话,
我所知道的周边的会c++的同学,可手握10多个offer,随心所欲,而找啥算法岗的,基本gg
提示:系列c++学习的基础和高阶知识,用于公司生产实践中,实实在在的公司部署产品要用的,因为c++速度快,
而java和Python速度慢,自然往硬件里面部署算法啥的,都得用c++或者c,因此本科学的c很重要,后来的Python或者java就没有那么重要了,
c/c++系列文章:
【1】c++:c语言优缺点,visual studio2019如何新建项目,写hello world程序
【2】c/c++:gcc安装,gcc编译hello world文件,system函数调用系统命令,sleep函数
【3】linux下gcc的编译过程和功能,预处理,编译,汇编,链接,.c预处理为.i文件.s文件.o文件.exe文件
【4】c/c++:windows平台下依赖的动态库,c底层是汇编语言,程序断点调试,反汇编,vs快捷键
【5】c/c++:数据类型,常量变量,标识符,有符号整型,无符号unsigned,字符类型,字符串类型,实数类型,浮点型,科学计数法
【6】c/c++:2进制、8进制、10进制、16进制和进制之间的转换,c语言输出匹配格式%
【7】c/c++:原码,反码,补码和常见的数据类型取值范围,溢出
【8】c/c++:类型限定符,printf输出格式,putchar,scanf,getchar
【9】c/c++:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换
【10】c/c++:顺序结构,if else分支语句,do while循环语句,switch case break语句
【11】c/c++:for循环语句,分号不可省略,表达式可以省略,猜数字游戏,跳转语句continue,break,避免写goto
【12】c/c++:一维数组,初始化数组,循环打印数组,计算数组存储空间,数组元素个数,数组逆序算法
【13】c/c++:二维数组,数组的行数和列数求法sizeof,数组初始化不同形式,5个学生,3门功课,求学生总成绩和功课总成绩
【14】c/c++:visual studio的代码快捷键,VS设置自定义默认代码,使用快捷键
【15】c/c++:三维数组,字符数组和字符串,统计字符串中字符出现的频次,scanf输入空格,正则匹配表达式
【16】c/c++:gets(),fgets(),puts(),fputs(),strlen(),字符串拼接函数
【17】c/c++:函数的作用,分类,随机数,函数定义,调用,申明,exit()函数,多文件编程,防止头文件重复
【18】c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL
【19】c/c++:万能指针,泛型指针,const int *p,int const *p,int *const p,const int *const p,指针与数组,p++,
c/c++:指针p+p-p*p/
void f67(void)
{
int a = 10;
int b = 20;
int* p = &a;
//printf("%p
", p/2);//不能乘除?
}
指针不能做乘除运算
你把地址乘除有啥意义
加减是可以的
前后挪动多少字节
void f67(void)
{
int a = 10;
int b = 20;
int* p = &a;
//printf("%p
", p/2);//不能乘除?
printf("%p
", p + 2);//不能乘除?
printf("%p
", p - 2);//不能乘除?
}
int main(void)
{
f67();
system("pause");
return 0;
}
数组中加减整数也是前后挪动一个位置
数组中说偏字节没用
就是挪动一个位置
左右移动地址
好说
数组名取地址+1
是啥?
void f68(void)
{//指针和数组
int a[] = { 1,2,4 };
int* p = a;//b本身就是地址
printf("%p
", a);
printf("%p
", &a[0]);
printf("%p
", p+1);//这是取地址
printf("%p
", a+1);//这是取地址
printf("%p
", &a);//这是取地址
printf("%p
", &a+1);//这是取地址---很猛
}
int main(void)
{
f68();
system("pause");
return 0;
}
发现了吗,&a+1,挪动了12个字节【即a数组大小】
a+1=p+1,是p+1挪动了一个字节而已,到下一个元素
而&a+1
是加整个数组的字节,p挪动到整个数组后面了
牛了这个
&a不是取数组首个地址【因为a=&a[0]】
而是整个数组的地址
所以你+1
加的是数组类型整个这么大的空间
指针+指针
void f69(void)
{
int a = 10;
int b = 20;
int* p = &a;
int* q = &b;
//printf("%p
", p+q);//不可以操作
printf("%p
", p);//可以操作
printf("%p
", q);//可以操作
printf("%p
", p-q);//可以操作
}
对于普通变量
指针可以减,不可以加
但是没意义
那要是数组呢?
void f70(void)
{//指针和数组
int a[] = { 1,2,3,4,5,6,7,8,9,0 };
int* p = &a[3];
printf("%p
", p);//可以操作
printf("%p
", a);//可以操作
printf("%p
", p - a);//可以操作
}
int main(void)
{
f70();
system("pause");
return 0;
}
C=12=3个int自己
懂
实际也是类型这么个差距
int是3个这里
再看
void f70(void)
{//指针和数组
int a[] = { 1,2,3,4,5,6,7,8,9,0 };
int* p = &a[2];
printf("%p
", p);//可以操作
printf("%p
", a);//可以操作
printf("%p
", p - a);//可以操作
}
偏移过的元素个数
数组中指针相减
是俩指针之间的元素的偏移个数
相加不允许哦
数组读完后,野指针p-a的话
就是整个数组的偏移个数,也是整个数组的大小
懂???
用指针实现strlen函数
非指针形式
int mystrlen(char str[]) {
//传入字符数组
//原来是
int i = 0;
while (str[i] != '