我是靠谱客的博主 潇洒抽屉,最近开发中收集的这篇文章主要介绍C基础 个人笔记strlen()函数 和 sizeof 关键字typedef 和define函数传参函数重载指针类型的函数指向函数的指针(回调)数组与指针指针数组和二维数组this 指针c++11 智能指针深拷贝和浅拷贝,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C 笔记

  • strlen()函数 和 sizeof 关键字
  • typedef 和define
  • 函数传参
  • 函数重载
  • 指针类型的函数
  • 指向函数的指针(回调)
  • 数组与指针
  • 指针数组和二维数组
  • this 指针
  • c++11 智能指针
  • 深拷贝和浅拷贝

strlen()函数 和 sizeof 关键字

strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。
其原型如下面的代码所示:
size_t strlen(char const* str);

char array[100] = "abc";
/*用strlen()求长度*/
printf("array的长度=%dn", strlen(aray));

运行结果为 3
关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等
如下面的示例代码所示:

char array[100] = "abc";
/*用sizeof求长度*/
printf("array的长度=%dn", sizeof(array));

示例代码运行结果为 100

typedef 和define

typedef (int*) pINT;
#define pINT2 int*

效果相同?实则不同!实践中见差别:
pINT a,b;
效果同int *a; int *b;
表示定义了两个整型指针变量。
pINT2 a,b;
效果同int *a, b;
表示定义了一个整型指针变量a和整型变量b。

函数传参

函数形参在函数定义的时候是不占有内存空间的,当调用函数的时候,将实参传给形参的时候,才给形参分配内存空间。
return 语句一次只能返回一个值,当要返回多个值得时候,可以让参数双向传递。

#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void swap(int& a,int& b)
{
    int t =a;
    a=b;
    b=t;
    cout<<"swap a= "<<a<<" ,b= "<<b<<endl;
}
void swap2(int* a,int* b)
{
    int t =*a;
    *a=*b;
    *b=t;
    cout<<"swap2 a= "<<*a<<" ,b= "<<*b<<endl;
}
void splitFloat(float x,int* intPart,float* floatPart)
{
    *intPart = static_cast<int>(x);
    *floatPart = x-*intPart;
}
void swap3(int a,int b)
{
    int t =a;
    a=b;
    b=t;
	cout<<"swap3 a= "<<a<<" ,b= "<<b<<endl;
}
void foo(int* p,int &i)
{
    p=0;
    i=5;
}
int count_add(int n)
{
    static int ctr = 0;
    ctr += n;
    return ctr;
}
int add(int x = 5,int y = 6)
{
    cout<<"add x+y= "<<x+y<<endl;
    return x+y;
}

int main()
{
    int k=1,m=2;
    int& i = k; //定义变量k的引用
    cout<<"before k= "<<k<<" ,m= "<<m<<endl;
    cout<<"值传递--->"<<endl;
	swap3(k,m);
	cout<<"after k= "<<k<<" ,m= "<<m<<endl;

	cout<<"引用传递--->"<<endl;
    swap(k,m);
    cout<<"after k= "<<k<<" ,m= "<<m<<endl;
    k=1,m=2;
    cout<<"指针传递--->"<<endl;
	swap2(&k,&m);
	cout<<"after k= "<<k<<" ,m= "<<m<<endl;
    float x=3.14;
    float f;
    int n;
    splitFloat(x,&n,&f);
    cout<<"after 整数部分= "<<n<<" 小数部分= "<<f<<endl;
	cout<<"指针传递+引用传递--->"<<endl;
    foo(&k,m);
    cout<<"after k= "<<k<<" ,m= "<<m<<endl;
    cout<<"static 局部变量作用域--->"<<endl;
    for(int i =0;i<4;++i)
    {
        printf("%dn",count_add(i));
    }
    cout<<"数组作为函数的参数--->"<<endl;


    cout<<"带默认参数值的函数--->"<<endl;
    add(10,20);
    add(10);
    add();
    cout<<"定义可变参数的函数"<<endl;
    //initializer_list <int> lst; ???
    return 0;
}

结果:

before k= 1 ,m= 2
值传递--->
swap3 a= 2 ,b= 1
after k= 1 ,m= 2
引用传递--->
swap a= 2 ,b= 1
after k= 2 ,m= 1
指针传递--->
swap2 a= 2 ,b= 1
after k= 2 ,m= 1
after 整数部分= 3 小数部分= 0.14
指针传递+引用传递--->
after k= 2 ,m= 5
static 局部变量作用域--->
0
1
3
6
数组作为函数的参数--->
带默认参数值的函数--->
add x+y= 30
add x+y= 16
add x+y= 11
定义可变参数的函数

函数重载

形参不同:指形参个数不同或形参类型不同

指针类型的函数

不要将子函数中定义的局部变量地址返回给主函数。
可以将变量在主函数中定义。
在子函数中new出来的内存地址返回给主函数也是合法的。要注意释放。
在这里插入图片描述

指向函数的指针(回调)

在这里插入图片描述

#include <iostream>
using namespace std;
int computer(int a,int b,int(*func)(int,int)){
    return func(a,b);
}
int max(int a,int b){
    return ((a>b)?a:b);
}
int min(int a,int b){
    return ((a<b)?a:b);
}
int sum(int a,int b){
    return a+b;
}

int main()
{
    int a,b,res;
    cout<<"请输入整数a:";cin>>a;
    cout<<"请输入整数b:";cin>>b;
    res = computer(a,b,&max);
    cout<<"Max is "<<res<<endl;
    res = computer(a,b,&min);
    cout<<"Min is "<<res<<endl;
    res = computer(a,b,&sum);
    cout<<"Sum is "<<res<<endl;
}

结果:

请输入整数a:10
请输入整数b:30
Max is 30
Min is 10
Sum is 40

数组与指针

#include <iostream>
using namespace std;
// 基本概念
int main()
{
    int a[10]={0,1};
    int* pa;
    pa = &a[0];
    cout <<"pa = "<<pa<<endl;
    cout <<"&a[0] = "<<&a[0]<<endl;
    cout <<"a = "<<a<<endl;
    cout <<"*pa = "<<*pa<<endl;
    cout <<"a[0] = "<<a[0]<<endl;
    cout <<"*(pa+1) = "<<*(pa+1)<<endl;
    cout <<"a[1] = "<<a[1]<<endl;
}

结果:

pa = 0x28fed4
&a[0] = 0x28fed4
a = 0x28fed4
*pa = 0
a[0] = 0
*(pa+1) = 1
a[1] = 1

指针数组和二维数组

#include <iostream>
using namespace std;
int main()
{
    int line1[]={1,0,0};
    int line2[]={0,1,0};
    int line3[]={0,0,1};

    //指针数组
    int* pline[3] = {line1,line2,line3};
    cout<<"打印矩阵:"<<endl;
    for (int i = 0;i<3;i++)
    {
        for(int j = 0;j<3;j++)
        {
            cout<<pline[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

结果:

打印矩阵:
1 0 0
0 1 0
0 0 1

二维数组是一段连续存储的空间。
指针数组,不是连续存储。
在这里插入图片描述

this 指针

隐含于类的每一个非静态成员函数中
return x ;
return this->x;

c++11 智能指针

unique_ptr:
shared_ptr:
weak_ptr:

深拷贝和浅拷贝

成员有指针,使用深拷贝构造函数

在这里插入图片描述

最后

以上就是潇洒抽屉为你收集整理的C基础 个人笔记strlen()函数 和 sizeof 关键字typedef 和define函数传参函数重载指针类型的函数指向函数的指针(回调)数组与指针指针数组和二维数组this 指针c++11 智能指针深拷贝和浅拷贝的全部内容,希望文章能够帮你解决C基础 个人笔记strlen()函数 和 sizeof 关键字typedef 和define函数传参函数重载指针类型的函数指向函数的指针(回调)数组与指针指针数组和二维数组this 指针c++11 智能指针深拷贝和浅拷贝所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部