c++ 加强指针理解

简介: c++ 加强指针理解

操作内存,指针再理解

#inclu#include<iostream>
using namespace std;
int main()
{
//内存分配
    void *a1=malloc(1000);
//写入字符串
    int *a2= (int*)a1;
    *a2= (int)"这是写入的字符121212121212121212121212";
//强制指针类型转换
    cout<< (char*)*(int*)a1 <<endl;
//写入整数
    *a2=1000121;
    int *a3 = (int*)a1;
    cout << "指针中保存的地址(变量的地址)                " << a3 <<endl;
    cout << "取指针中保存的地址的值 (变量的值)       " << *a3 <<endl;
    cout << "取指针的地址指针 (指针自身的地址)        " << &a3 <<endl;
    cout << "对指针中的值 取地址 和 直接访问指针得到的都是 变量的地址  " <<&(*a3) <<endl;
}

运行结果

多重指针

  int a[2];
    string s1="asfa",s2="qwqwqw";
    a[0]=(int)&s1;
    a[1]=(int)&s2;
    int i1=1212;
    int i2=4444;
    int* point1=&i1;
    int** point2=&point1;
    *point1=222;
    cout<< *(string*)(a[1]) <<endl;
    cout << typeid(point1).name()  << endl;
    cout << *point1 <<endl;
    cout << i1 <<endl;
    **point2=345;
    int* point12=&i2;
    point2=&point12;
    **point2=5555;
    cout << i1 <<endl;
    cout << i2 << endl;

手动指针访问数组

#include<iostream>
using namespace std;
int main{
//定于整形数组,循环访问他们
    int intlist1[]={76, 77, 75, 33};
    for(int i=0;i<4;i++){
        cout << &intlist1[i] << "  "  << intlist1[i] <<endl;
    }
// 采用 int * 指针访问他们
    int* intPoint1=intlist1;
    for(int i=0;i<4;i++){
        cout<<"int* 访问" <<*(intPoint1++) <<endl;
    }
// 采用 void * 空指针访问他们
    void* voidPoint1=intlist1;
    int ontIntLenth= sizeof(int);
    for(int i=0;i<4;i++){
        cout<< "void* 访问" << *(int*)(int(voidPoint1)+i*ontIntLenth) <<endl;
    }
// 采用 char* 指针访问他们
    char* charPoint1=(char*)intlist1;
    for(int i=0;i<4;i++){
        cout<< "char* 访问" << charPoint1+i*ontIntLenth <<endl;
    }
//关于 char* 的一些特殊说明
// 关于 char string1[]="xxxxxxx"
// 以及 char* 的区别
// 所以以后千万不要再单独使用 char *
// 因为 char * 默认不可修改, 要使用时,务必在前面加上 const 提醒自己以及别人
// 截取字符
    char charP2[]="KKK!111111111111111111111111111111";
    cout<< charP2 <<endl;
    char* charP3=charP2;
    int oneCharLen= sizeof(char);
    charP3+=5*oneCharLen;
    const char * temp1="\0";
    *charP3=*temp1;
    cout<< charP2 <<endl;
}

快速加载整个文件

// 根据文件路径 读取文件  返回包含文件内容的字符串
std::string getStringFromFile(string filepath){
    std::ifstream in(filepath);
    std::istreambuf_iterator<char> begin(in);
    std::istreambuf_iterator<char> end;
    std::string some_str(begin, end);
    if(some_str==""){
        std::cout << "open-file-error" <<endl;
    }
    return some_str;
}

程序运行计时

#include<iostream>
#include<ctime>
using namespace std;
void showruntime(clock_t startTime, clock_t endTime){
    cout << "The run time is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
}
int main(){
clock_t starttime1,endtime1;
starttime1=clock();
//要计时的运行内容
//
endtime1=clock();
showruntime(starttime1,endtime1);
}

查看机器最大线程数

#include<thread>
#include<iostream>
using namespace std;
int main(){
cout << std::thread::hardware_concurrency() <<endl;
}

简单多线程

简单例子一

#include <iostream>
#include <pthread.h>
#include <thread>
#include <string>
#include <vector>
using namespace std;
//线程可以获取的全局变量
int maxThreadNumber=thread::hardware_concurrency();
vector<string> numlist;
//现成的启动函数
void *oneThread(void *var1){
    int index1=*((int*)var1) ;
    cout<< numlist[index1] <<endl;
//线程安全退出
    pthread_exit(NULL);
}
int main(){
//    获取机器最大线程数
    pthread_t threads[maxThreadNumber];
    int threadIndex[maxThreadNumber];
    //线程创建返回状态标记, 0 代表正常
    int rc;
    int i;
    for(i=0;i<maxThreadNumber;i++){
        numlist.push_back("线程"+to_string(i));
        threadIndex[i]=i;
        rc = pthread_create(&threads[i], NULL,
                oneThread, (void *)&(threadIndex[i]));
        if (rc){
            cout << "Error:无法创建线程," << rc << endl;
            exit(-1);
        }
    }
    pthread_exit(NULL);
}

例子二 线程内获取 程序运行的总时间差

#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <ctime>
#include <fstream>
using namespace std;
#define NUM_THREADS     8
void showruntime(clock_t startTime, clock_t endTime){
    cout << "The run time is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
}
void *PrintHello(void *threadid)
{
    clock_t starttime1,endtime1;
        // 对传入的参数进行强制类型转换,由无类型指针变为整形数指针,然后再读取
        starttime1 = *((clock_t*)threadid);
        string bigtestdatafile="data/test_data.txt";
        getStringFromFile(bigtestdatafile);
//输出线程结束 运行时间
    endtime1=clock();
    showruntime(starttime1,endtime1);
    pthread_exit(NULL);
}
int main ()
{
    clock_t starttime1,endtime1;
    starttime1= clock();
    pthread_t threads[NUM_THREADS];
    int indexes[NUM_THREADS];// 用数组来保存i的值
    int rc;
    int i;
    for( i=0; i < NUM_THREADS; i++ ){
        cout << "main() : 创建线程, " << i << endl;
        indexes[i] = i; //先保存i的值
        // 传入的时候必须强制转换为void* 类型,即无类型指针
        rc = pthread_create(&threads[i], NULL,
                            PrintHello, (void *)&(starttime1));
        if (rc){
            cout << "Error:无法创建线程," << rc << endl;
            exit(-1);
        }
    }
    endtime1=clock();
//    showruntime(starttime1,endtime1);
    pthread_exit(NULL);
}

进一步多线程加载文件

相关文章
|
7天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
34 0
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
99 4
|
2月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
2月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
63 1
|
2月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
47 2
|
2月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
3月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
56 3
|
2月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
2月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值