2017年6月 阅读书籍《C和指针》


#if 0

#endif

比注释掉代码好。(《C和指针》2017.06.07)


全局变量和全局静态变量的区别
1)全局变量是不显式用static修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
2)全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。(2017.06.07)
 

数组名的值是指针常量。
数组有指针与下标两种使用方式,下标绝不会比指针更有效率,但指针有时会比下标更有效率。
指针比下标更有效率的场合:在循环中一次一步地移动时。(《C和指针》2017.06.12)

 
 二维数组做函数参数:
void func2( int (*mat)[10] );
void func2( int mat[][10] );
 

二级指针的作用。
函数外面指针*p,要通过函数修改其指向的内容,函数形参应写为**p,否则作为值传递,只是单纯拷贝一份指针。你可以改变指针所指向内存的值,但你不能改变原指针所对指向的内存位置。
 
 

 gcc C语言编译:

(1).预处理,生成预编译文件(.文件):

Gcc –E hello.c –o hello.i
       (2).编译,生成汇编代码(.s文件):

Gcc –S hello.i –o hello.s
       (3).汇编,生成目标文件(.o文件):
        Gcc –c hello.s –o hello.o
       (4).链接,生成可执行文件:
        Gcc hello.o –o hello


目标文件反汇编objdump -S obj   或者 objdump -d obj

各个段信息        objdump -s obj

查看目标文件文件格式分段信息objdump -h obj

查看各个段大小size obj


函数指针:

  int f(int);

int (*pf)(int) = &f;

int ans = f(25);

ans = (*pf)(25);     //将函数指针转化为函数名,和上一条左右一致

ans = pf(25);         //这个转换并不是必须的,因为编译器在执行函数调用操作符之前又会把它转换回去2333


C++ 获取指定目录下所有文件目录,这个函数是网上找的,但没有提到64位和32位写法的差别,我这里是64位和32位两个版本。

需要头文件:

#include <io.h>
#include <iostream>
#include <vector>
using namespace std;

32位:

/*
** 作者:sonne
** 日期:2017-06-12
** 说明:读取制定目录下所有文件路径和文件名
*/
void FileOperate::getFileNamesAndPaths(string path, vector<string>& files, vector<string>& file_name)
{
//文件句柄
long hFile = ;
//文件信息,声明一个存储文件信息的结构体
struct _finddata_t fileinfo;
//字符串,存放路径
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -)//若查找成功,则进入
{
do
{
//如果是目录,迭代之
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != && strcmp(fileinfo.name, "..") != )
getFileNamesAndPaths(p.assign(path).append("\\").append(fileinfo.name), files, file_name);
}
//如果不是,加入列表
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
file_name.push_back(fileinfo.name);
}
} while (_findnext(hFile, &fileinfo) == );
//_findclose函数结束查找
_findclose(hFile);
}
}

64位:

/*
** 作者:sonne
** 日期:2017-06-12
** 说明:读取制定目录下所有文件路径和文件名
*/
void getFileNamesAndPaths(string path, vector<string>& files, vector<string>& file_name)
{
//文件句柄
__int64 hFile = ;
//文件信息,声明一个存储文件信息的结构体
//struct _finddata_t fileinfo;
struct __finddata64_t fileinfo;
//字符串,存放路径
string p;
if ((hFile = _findfirst64(p.assign(path).append("\\*").c_str(), &fileinfo)) != -)//若查找成功,则进入
{
do
{
//如果是目录,迭代之
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != && strcmp(fileinfo.name, "..") != )
getFileNamesAndPaths(p.assign(path).append("\\").append(fileinfo.name), files, file_name);
}
//如果不是,加入列表
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
file_name.push_back(fileinfo.name);
}
} while (_findnext64(hFile, &fileinfo) == );
//_findclose函数结束查找
_findclose(hFile);
}
}

C++拷贝构造函数有两种,深拷贝和浅拷贝。

浅拷贝只是简单赋值成员变量。

若涉及堆内存,需要深拷贝。否则浅拷贝的方式会导致两个指针指向同一个堆内存可能导致同一内存被释放两次。

可以将拷贝构造函数写为private来禁止拷贝。


删除一个目录下全部文件夹和文件:

bool removeDir(const char* szFileDir)
{
std::string strDir = szFileDir;
if (strDir.at(strDir.length() - 1) != '\\')
strDir += '\\';
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile((strDir + "*.*").c_str(), &wfd);
if (hFind == INVALID_HANDLE_VALUE)
return false;
do
{
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (_stricmp(wfd.cFileName, ".") != 0 &&
_stricmp(wfd.cFileName, "..") != 0)
removeDir((strDir + wfd.cFileName).c_str());
}
else
{
DeleteFile((strDir + wfd.cFileName).c_str());
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind);
RemoveDirectory(szFileDir);
return true;
}

获取当前目录(当前程序所在文件夹):

    char cPath[MAX_PATH+1];
_getcwd(cPath, sizeof(cPath));

windows下vs编译的C++程序要求获取管理员权限:

打开项目-项目属性-连接器-清单文件-UAC执行级别修改为requireAdministrator (/level='requireAdministrator')保存运行即可。

对你没看错,就这么简单!运行时自动要求提供管理员权限

获取系统目录:

    char str[MAX_PATH];
GetSystemDirectory(str, MAX_PATH);
std::cout << str << std::endl;

输出C:\WINDOWS\system32


禁止64位系统文件重定向:

    PVOID OldValue = NULL;
Wow64DisableWow64FsRedirection(&OldValue);
//………………
//………………
Wow64RevertWow64FsRedirection(OldValue);

字符串转化为guid:

typedef struct _GUID_TEMP {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
int Data4[8];
} GUID_TEMP; BOOL LPCTSR2GUID(LPCTSTR szGUID, GUID &Guid) {
memset(&Guid, 0, sizeof(Guid)); GUID_TEMP GUID_TEMP; int nRet =
sscanf_s(szGUID,
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
&GUID_TEMP.Data1,
&GUID_TEMP.Data2,
&GUID_TEMP.Data3,
&GUID_TEMP.Data4[0], &GUID_TEMP.Data4[1],
&GUID_TEMP.Data4[2], &GUID_TEMP.Data4[3], &GUID_TEMP.Data4[4], &GUID_TEMP.Data4[5], &GUID_TEMP.Data4[6], &GUID_TEMP.Data4[7]
);
Guid.Data1 = GUID_TEMP.Data1;
Guid.Data2 = GUID_TEMP.Data2;
Guid.Data3 = GUID_TEMP.Data3;
memcpy(&Guid.Data4[0], &GUID_TEMP.Data4[0], 1);
memcpy(&Guid.Data4[1], &GUID_TEMP.Data4[1], 1);
memcpy(&Guid.Data4[2], &GUID_TEMP.Data4[2], 1);
memcpy(&Guid.Data4[3], &GUID_TEMP.Data4[3], 1);
memcpy(&Guid.Data4[4], &GUID_TEMP.Data4[4], 1);
memcpy(&Guid.Data4[5], &GUID_TEMP.Data4[5], 1);
memcpy(&Guid.Data4[6], &GUID_TEMP.Data4[6], 1);
memcpy(&Guid.Data4[7], &GUID_TEMP.Data4[7], 1);
return (nRet == 11) ? TRUE : FALSE;
}

guid转化为字符串:

LPCTSTR GUID2LPCTS(GUID Guid) {
static TCHAR szBuf[65] = { 0 };
_snprintf_s(szBuf, 64, _T("%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X"),
Guid.Data1,
Guid.Data2,
Guid.Data3,
Guid.Data4[0], Guid.Data4[1],
Guid.Data4[2], Guid.Data4[3], Guid.Data4[4], Guid.Data4[5], Guid.Data4[6], Guid.Data4[7]
);
return szBuf;
}

写数据到bmp图片:

int WriteBMP(const char* file, unsigned char* Input)
{
unsigned char head[1078] = {
/***************************/
//file header
0x42,0x4d,//file type
//0x36,0x6c,0x01,0x00, //file size***
0x0,0x0,0x0,0x00, //file size***
0x00,0x00, //reserved
0x00,0x00,//reserved
0x36,0x4,0x00,0x00,//head byte***
0x28,0x00,0x00,0x00,//struct size
0x00,0x00,0x0,0x00,//map width***
0x00,0x00,0x00,0x00,//map height*** 0x01,0x00,//must be 1
0x08,0x00,//color count***
0x00,0x00,0x00,0x00, //compression
0x00,0x00,0x00,0x00,//data size***
0x00,0x00,0x00,0x00, //dpix
0x00,0x00,0x00,0x00, //dpiy
0x00,0x00,0x00,0x00,//color used
0x00,0x00,0x00,0x00,//color important
}; FILE *fh; if ((fh = fopen(file, "wb")) == NULL)
return 0; int i, j; long num;
num = IMAGE_X;
head[18] = num & 0xFF;
num = num >> 8; head[19] = num & 0xFF;
num = num >> 8; head[20] = num & 0xFF;
num = num >> 8; head[21] = num & 0xFF; num = IMAGE_Y; head[22] = num & 0xFF;
num = num >> 8; head[23] = num & 0xFF;
num = num >> 8; head[24] = num & 0xFF;
num = num >> 8; head[25] = num & 0xFF; j = 0;
for (i = 54; i < 1078; i = i + 4)
{
head[i] = head[i + 1] = head[i + 2] = j;
head[i + 3] = 0;
j++;
} fwrite(head, 1, 1078, fh); for (i = 0; i <= IMAGE_Y - 1; i++)
{ fseek(fh, 1078 + (IMAGE_Y - 1 - i)*IMAGE_X, SEEK_SET); fwrite((Input + i * IMAGE_X), 1, IMAGE_X, fh);
}
fclose(fh);
return 1;
}

读文件到unsigned char数组:

int read_data_hex(unsigned char *buf, int length, const char *string)
{
FILE *fp;
fp = fopen(string, "rb");
if (NULL == fp)
{
return -1;
}
fread(buf, sizeof(unsigned char), length, fp); fclose(fp);
fp = NULL;
return 0;
}

写文件到unsigned char数组:

int write_data_hex(unsigned char * array, int length, const char *string)
{
int i = 0;
FILE *fp;
fp = fopen(string, "wb+");
if (NULL == fp)
{
printf("file open Fail!\n");
return -1;
}
while (i < length)
{
fwrite(&array[i], sizeof(char), 1, fp);
i++;
}
fclose(fp);
return 0;
}

获取年月日时分秒:

#include<time.h>
int main()
{
time_t timep;
struct tm *p;
time (&timep);
p=gmtime(&timep);
printf("%d\n",p->tm_sec); /*获取当前秒*/
printf("%d\n",p->tm_min); /*获取当前分*/
printf("%d\n",8+p->tm_hour);/*获取当前时,这里获取西方的时间,刚好相差八个小时*/
printf("%d\n",p->tm_mday);/*获取当前月份日数,范围是1-31*/
printf("%d\n",1+p->tm_mon);/*获取当前月份,范围是0-11,所以要加1*/
printf("%d\n",1900+p->tm_year);/*获取当前年份,从1900开始,所以要加1900*/
printf("%d\n",p->tm_yday); /*从今年1月1日算起至今的天数,范围为0-365*/
}

带多态性质的基类(含有virtual函数)应该声明virtual析构函数。(《Effective C++》)


C修改开机密码:

下面写法需要获取管理员权限

#include <stdio.h>
#include <stdlib.h> int main() {
char user[] = { };
const char *user_name = "sonne";
const char *user_password = "huawei.123";
char print[] = { };
sprintf_s(user, "net user %s %s", user_name, user_password);
system(user);
sprintf_s(print, "已经将用户名:%s 的密码改成了:%s", user_name, user_password);
printf(print);
system("pause");
return ;
}

微软的函数,可修改密码,需要输入旧密码

NET_API_STATUS NET_API_FUNCTION NetUserChangePassword(
IN LPCWSTR domainname,
IN LPCWSTR username,
IN LPCWSTR oldpassword,
IN LPCWSTR newpassword
);

如何判断输入的开机密码是否正确?

使用NetUserChangePassword函数,只不过旧密码和新密码参数一样。然后判断返回值。

关于这个函数的例程:

#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "netapi32.lib") #include <stdio.h>
#include <windows.h>
#include <lm.h> int wmain(int argc, wchar_t *argv[])
{
DWORD dwError = ;
NET_API_STATUS nStatus;
//
// All parameters are required.
//
if (argc != )
{
fwprintf(stderr, L"Usage: %s \\\\ServerName UserName OldPassword NewPassword\n", argv[]);
exit();
}
//
// Call the NetUserChangePassword function.
//
nStatus = NetUserChangePassword(argv[], argv[], argv[], argv[]);
//
// If the call succeeds, inform the user.
//
if (nStatus == NERR_Success)
fwprintf(stderr, L"User password has been changed successfully\n");
//
// Otherwise, print the system error.
//
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus); return ;
}

在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。
-----《C++ Primer》

引用与指针的区别:

1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
4. 引用没有 const,指针有 const;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
7. 指针和引用的自增(++)运算意义不一样;
8.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。


动态链接库和COM组件的区别

1动态链接库的表现形式只能是dll[变态该名的除外], COM组件的表现形式可以是dll也可以是exe。

     注:其实字体、驱动等也算是动态链接库的一种,这里略去...

2 动态链接库的生成和编译器及系统相关,在Windows/Linux下系统,需要分别编译才能使用。

COM组件是二进制编码,在Windows和Linux下可以直接使用,不需要重新编译。

3 COM组件是按照COM规范实现的dll或者exe;动态链接库是一个可以导出函数的函数集合。

4 动态链接库只能在本机被调用,COM组件支持分布式使用。


const对象和const成员函数的关系:
(1)有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。
(2)除此之外,在类的成员函数后面加 const 还有什么好处呢?那就是常量(即 const)对象可以调用 const 成员函数,而不能调用非const修饰的函数。 
 

亦或校验:
BYTE bcc(BYTE* aub_data_p, BYTE auw_data_length)
{
BYTE aub_check_sum = ;
WORD auw_cnt = ; while (auw_cnt < auw_data_length)
{
aub_check_sum ^= aub_data_p[auw_cnt];
auw_cnt++;
}
return aub_check_sum;
}

如果需要跳过消息头,则写auw_cnt=1


 
C++追加文件写日志,带时间

#include <windows.h>
#include <iostream>
#include <fstream>
#include <time.h> void printMyTxt(std::string str)
{
time_t rawtime;
struct tm* ptminfo; time(&rawtime);
ptminfo = localtime(&rawtime);
CHAR* strTime = new CHAR[];
sprintf(strTime, "%02d-%02d-%02d %02d:%02d:%02d",
ptminfo->tm_year + , ptminfo->tm_mon + , ptminfo->tm_mday,
ptminfo->tm_hour, ptminfo->tm_min, ptminfo->tm_sec);
std::string strLog; strLog = "【";
strLog.append(strTime).append("】").append(str).append("\r\n"); std::ofstream write("record.txt", std::ios::app);//打开record.txt文件,以ios::app追加的方式输入
write << strLog << std::endl;
write.close();//关闭文件 return;
} int main()
{
printMyTxt("hhhhh");
printMyTxt("LLLLL");
std::cout << "Hello World!\n";
}

C、C++笔记的更多相关文章

  1. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  2. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  3. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. NET Core-学习笔记(三)

    这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...

  7. springMVC学习笔记--知识点总结1

    以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...

  8. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  9. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  10. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

随机推荐

  1. iOS 通讯录基础

    iOS  6 之后应用訪问通讯录须要获得用户授权,而且仅仅授权一次,即使卸载了之后再安装.也不用再次授权. 开发通讯录应用须要两个框架: 1.ABAddressBook    主要用于提供訪问通讯录中 ...

  2. java.lang.ExceptionInInitializerError异常分析

    今天在项目开发时遇到一个问题,整个项目是使用Spring等框架搭建起来的在运行项目时不报任何的异常信息,就是找不到某个类信息,各方查找该类确实是存在的,最后通过断点跟踪时在异常栈内发现java.lan ...

  3. python列表分页

    列表分页   上章的结束,若在实际开发过程中,会发现一个问题,那就首页或关注分享,是一下子按时间顺序全部显示出来,这在实际项目中不可能出现的,想想实际中的产品是如何做的? 一般来说,无非是两种,一种是 ...

  4. Scala Control Structures

    Scala之Control Structures 一.前言 前面学习了Scala的Numbers,接着学习Scala的Control Structures(控制结构). 二.Control Struc ...

  5. tinkerpop(1) 地图数据库console科研

    原创文章连接: http://blog.csdn.net/freewebsys/article/details/46348975 转载请注明出处. 1,关于图数据库 tinkerpop是apache孵 ...

  6. Java--Vector类

    Java Vector 类 Vector类实现了一个动态数组.和ArrayList和相似,但是两者是不同的: Vector是同步访问的. Vector包含了许多传统的方法,这些方法不属于集合框架. V ...

  7. 2 WCF里面配置的含义

    1 首先介绍所谓的a,b,c. a就是address 地址: b binding 绑定的协议 譬如http  tcp udp 利用这些协议方式请求address: c contract  代表请求的规 ...

  8. Tagging Physical Resources in a Cloud Computing Environment

    A cloud system may create physical resource tags to store relationships between cloud computing offe ...

  9. 批处理文件的工具(java+shell为了实现)

    批处理文件的工具(java+shell为了实现) 有一堆语料须要处理一下才干使用,本来应该能够直接用shell脚本直接处理的. 可是对shell脚本不熟,仅仅会简单的一些命令. 因此就利用java+s ...

  10. iOS8的APP过渡过程

    1. 2. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWluX3hpYW53ZWk=/font/5a6L5L2T/fontsize/400/fill/ ...