C指针(2):指针的长度和类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C指针(2):指针的长度和类型相关的知识,希望对你有一定的参考价值。

参考技术A 不同的机器和编译器在给C的基本数据类型分配空间上有不同的做法. 模型取决于操作系统和编译器,一种操作系统可能支持多种模型,这通常是用编译器选项来控制的

size_t类型表示C中任何对象所能达到的最大长度, 无符号整数, 可用于sizeof操作符的返回值类型

intptr_t和uintptr_t类型用来存放指针地址。它们提供了一种可移植且安全的方法声明指针,而且和系统中使用的指针长度相同,对于把指针转化成整数形式来说很有用

uintptr_t是intptr_t的无符号版本

ptrdiff_t类型表示两个指针差值的可移植方式. 指针相减的结果以ptrdiff_t类型返回。因为指针长度可能不同,这个类型简化了处理差值的任务

c 复习

  • 什么是指针?举例说明指针数组和数组指针的区别。
    指针: 定义(类型名变量名), 用于保存地址, 地址保存的值类型和指针相同
    数组指针: 指向数组的指针 类型 (
    变量名)[长度] = 类型 变量名[XX][列(长度)]
    指针数组: 保存指针的数组 基本类型* 变量名[长度]

  • 字符串指针和字符串数组有什么区别,请详细说明。
    char *p = "12345678"; // p是指针,p可以改变, sizeof(p):4 , "12345678"在常量数据区
    char p[] = "12345678"; // p是数组,p本身不可以改变 sizeof(p):9 赋值完成后"12345678"放在栈区

  • 可以对指针进行哪些操作,分别会产生怎样的效果。
    p+整数: p + sizeof(指向的类型) 整数 0x00 + 1 = 0x00 + sizeof(int)1 = 0x04
    p-整数: p - sizeof(指向的类型) 整数 0x04 - 1 = 0x04 - sizeof(int)1 = 0x00
    p-指针: 两个元素差了多少个元素
    ++/--: 和 +整数 -整数一样

  • 什么是数组,说明数组的基本特征。
    数组就是用于连续存储相同类型数据的一种结构

  • 从内存角度解释数组在函数传参过程中发生了哪些变化。
    当将一个数组作为参数传入函数的时候,会进行退化
    退化为指向数组首元素地址的指针,所以说,这个指针的大小是4
    数组的大小不会改变,它的大小就是sizeof(类型)*长度

  • 数组和指针是怎样进行相互转化的,它们之间有什么区别?
    char n[10], pn = n(&n[0]); // char
    n[0] ==
    (pn+0) == pn[0]
    char n[10][10], (pn)[10] = n(&n[0]); // char[10]
    n[1][2] ==
    (*(pn+1)+2) == pn[1][2]

  • 使用一个函数一般分为几个步骤,分别是什么?
    声明函数 -> 定义函数 -> 调用函数

  • 默认形参是什么,如何为一个函数添加默认形参
    默认形参用于被经常使用但又有少数情况需要其他值的情况。
    默认形参可以在函数声明或函数定义的时候添加
    使用规则:必须从右往左定义,中间不能有间隔

  • 在C++中引用和指针有什么异同,如何定义他们。
    定义指针(*),定义引用使用(&)
    异: 语法规则上引用没有地址,引用不能引用引用,引用必须初始化,引用只能引用一个变量
    同: 都可以在函数中修改形参

  • 在C++中函数的传参方式有几种,分别是什么?
    传地址、传引用、传值

  • 面向对象的基本特性是什么,分别体现在哪里?
    封装:访问属性
    继承: 继承
    多态: 虚函数、函数重载、模板

  • 在不同权限的继承中,基类成员的访问权限在子类中会产生哪些变化?
    public private protected
    public public 不被继承 protected
    private private 不被继承 private
    protected protected 不被继承 protected

  • 例举出常用的字符串操作函数以及它的作用<string.h>。
    strlen() - 获取字符串长度
    strcpy() - 拷贝字符串
    strcmp() - 比较字符串
    strcat() - 拼接字符串
    strtok() - 字符串切割

  • 怎样定义和使用一个虚函数,析构函数为什么最好被定义为虚函数。
    在成员函数前加virtual关键字。
    避免产生内存泄漏。

  • 当类中存在虚函数时,它会产生哪些变化。
    它的首地址位置会多出一个虚表指针,指向的是一个保存当前类所有虚函数的虚表
    内存角度上,类对象的大小多了指针的长度

  • 什么情况下会使用到虚继承,使用的格式是什么
    用于消除菱形继承产生的二义性。
    class A{ public: int n;}
    class B: public A{ }
    class C: public A{ }
    class D : public virtual B, virtual public C { }

  • 函数重载是什么,进行重载时有哪些要求。
    函数重载可用于实现多态,它可以使相同的函数接收不同的参数
    要求: 参数个数、参数类型不同,只有返回值不同的不可以重载

  • 重写、重载和覆盖分别是什么,请详细说明。
    重写(作用域不同): 虚函数, 完全相同
    重定义(作用于不同):子类函数名和父类相同
    重载(作用域相同):函数名相同,函数特征不同

  • 运算符重载有几种形式,一般使用哪种形式,有哪些运算符不能被重载。
    友元重载(<< >>)\推荐使用成员重载
    . ,: :: -> sizeof

  • 怎样使用模板,模板特化与模板偏特化分别是什么,函数为什么没有偏特化?
    template<class/typename T, ...>
    模板特化: 针对于特殊类型特化所有的T类型
    模板偏特化: 针对于特殊类型特化部分的T类型
    函数的偏特化其实就是函数重载

  • new\malloc 和 delete\free有什么区别。
    new\delete 会调用构造和析构
    new\delete 是运算符
    new 会返回指定类型的对象,malloc是void*

  • 使用宏有哪些需要注意的地方,怎样避免出现这样的情况。
    宏没有类型检测,宏没只是简单的替换,要注意优先级

  • 怎样定义一个静态数据成员,如何使用这个成员。
    使用static在类中声明,在类外初始化。
    public: 类名::变量 对象.变量

  • 怎样定义一个静态成员函数,使用这个函数需要注意什么。
    在成员函数前加上static。 只能访问类内的静态成员

  • 在C++中结构体和类有什么区别,举例说明。
    C++中除了默认访问权限,其它都一样
    struct(public) class(private)

  • ++i(--i)和i++(i--)有什么区别,举例说明.
    ++i: 先++再使用 i++先使用再++

  • 运算优先级最低的元算符是什么,最高的是什么,obj->num++的执行顺序是什么
    , . -> ++

  • 怎样获取和设置一个函数执行后的错误码,一般在什么时候获取它。
    获取: GetLastError(), 监视窗口输入err,hr,在函数执行完毕之后
    SetLastError()

  • 什么是内核对象,他有哪些特性,例举你知道的内核对象。
    内核对象是操作系统维护的一组数据结构,它是跨进程的,它拥有一个引用计数,
    当打开一个内核对象的时候,引用计数+1,关闭时-1,当计数为0就销毁。
    进程、线程、互斥体、邮槽、IOCP、事件、信号量、线程池

  • 什么是内核句柄,怎样获取或关闭一个内核句柄。
    句柄是一个整型索引,用于在句柄表中查找对应的内核对象
    CreateProcess\CreateFile\CloseHandle()......

  • 列出几个常用到的线程操作函数
    CreateThread()/_beingthreadex()/TerminateThread()/_endthreadex/SuspendThread()/ResumeThread()

  • 列出几个常用到的进程操作函数
    CreateProcess()/ WinExec()/ system()/ TerminateProcess()/SuspendProcess()/ResumeProcess()

  • 说明临界区和互斥体有哪些区别
    临界区不是内核对象,临界区有线程拥有者,临界区崩了会死锁
    互斥体是内核对象,有线程拥有着,崩了不会死锁

  • 列出常用内核对象的创建函数
    CreateThread()/CreateProcess()/CreateMutex()/CreateEvent()

  • 说明动态链接库和静态链接库的区别。
    后缀名: .lib .dll
    使用: lib需要包含头文件,使用#pragma comment(lib, "")
    dll LoadLibrary() + GetProcAddress()
    程序: 动态链接库不会增加程序的大小,但是不方便程序的移植
    静态链接库会增加程序的大小,但是可以跨平台

  • 举例说明常用的导出函数的方法。
    使用.def模块定义文件导出 // 默认就没有名称粉碎
    使用_declspec(dllexprot) // extern "C" 用于防止名称粉碎机制

  • 说明信号量是什么,如何使用信号量。
    信号量可以被多次加锁,没有指定最大信号量
    加锁-1: WaitForXXXObject()
    解锁+1: ReleaseSemaphore()

  • 举例说明你说知道的进程间通信的方式。
    邮槽、套接字、WM_COPYDATA、管道

  • IOCP是什么,怎样创建和绑定设备道完成端口。
    IOCP全称IO完成端口,
    创建: HANDLE h = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 线程数)
    绑定: CreateIoCompletionPort(h, 设备句柄, 0, 0)

  • 使用udp通信,服务器和客户端的基本步骤是什么。
    服务器: WSAStartup() -> socket() -> bind() -> sendto()/recvfrom() -> closesocket() ->WSACleanup()
    客户端: WSAStartup() -> socket() -> bind() -> sendto()/recvfrom() -> closesocket() ->WSACleanup()

  • 使用tcp通信,服务器和客户端的基本步骤是什么。
    服务器: WSAStartup() -> socket() -> bind() -> listen() -> accept() -> send()/recv() -> closesocket() ->WSACleanup()
    客户端: WSAStartup() -> socket() -> connect() -> send()/recv() -> closesocket() ->WSACleanup()
    inet_addr("") htonl()

  • 异步IO是什么,怎样使用异步IO读写设备?
    同一时刻做多件事情,FILE_FLAG_OVERLAPPED

  • WaitForSingleObject的作用是什么,它的复数形式怎样使用。
    等待一个内核对象,当它为有信号时(激发态)就返回,否则等待道设置的超时时间
    WaitForMultipleObjects(要等待的个数,数组,是否等待所有,超时)
    WaitForSingleObject和WaitForMultipleObjects副作用: 等待信号量会把当前信号-1

  • 已学过的网络通信模型有哪几种?
    IOCP、消息选择、事件选择(64)

  • python的基本类型有几种,分别是什么
    int、float、复数

  • 分别说明怎样定义字典、列表和元组,并说明它们的特点
    dict = { }; dict = dict() 保存键值对,可以修改 *
    list = [ ]; list = list() 保存一组相连的数据,可修改
    tuple = (1,); tuple = tuple() 不可修改

  • 字符串切片指的是什么,详细说明它的用法。
    a = "1234567"
    a[:] = "1234567"
    a[:-1] = "123456"
    a[::-1] = "7654321"
    a[::2] = "1357"

  • 例举常用的python列表操作函数。
    list l
    l.append
    l.insert
    l.pop(index)

  • 什么是对称密码,什么是非对称密码,分别例举。
    对称密码使用的密钥相同 AES DES 3DES
    非对称密码使用的密钥不同 RSA RC4

  • 什么是凯撒密码,什么是维吉尼亚密码,什么是base64编码。
    凯撒密码:一种简单的替换密码
    维吉尼亚密码: 一种稍微复杂的替换密码
    base64: 使用指定的64个字符替换需要编码的字符串

  • RSA加密算法的本质是使用了哪一个数学难题?
    求大质数

  • 怎样创建、查看、使用和删除数据库?
    create database XXX;
    show databases;
    drop database XXX;
    use XXX;

  • 怎样创建、查看、重命名和删除一张表。
    create table XXX(列名 类型 约束, ...);
    show tables;
    desc table XXX;
    rename table x to xx;
    drop table XXX;

  • 怎样添加、删除和修改表的指定字段
    alter table XXX add 列名 类型 约束;
    alter table XXX change old new;
    alter table XXX modify XXX 类型;
    alter table XXX drop XXX 类型;

  • 怎样添加、删除和修改数据。
    insert into XXX(x1,x2) values(v1,v2);
    delete from XXX
    update XXX set x1 = v1, x2 = v2;

  • 表的约束有哪些,分别说明怎样使用这些约束
    主键: primary key;
    非空: not null;
    唯一: unique;
    默认: DEFAULT
    外键: ALTER table XXX add constraint foreign key(外间名) references XXX(xx)

  • 怎样获取表"CharInfo"中的所有数据? 怎样获取表"NetChat"中列"user"的所有数据?
    select * from CharInfo;
    select user from NetChat;

  • 怎样获取表"ChatFriend"中列"name"为"1"开头或"1"结尾的数据?
    select * from ChatFriend where name like "%1" or name like "1%"

  • 怎样获取表"ChatFriend"中列"name"为"1"或列"friend"为"1"的数据?
    select * from ChatFriend where name = 1 or friend = 1;

  • 三大窗口风格是什么,分别对应哪几个宏。
    子窗口(WS_CHILD) 弹出窗口(WS_POPUP) 重叠窗口(WS_OVERLAPPED)

  • UpdateData()的作用是什么,他又哪几种用法,分别是什么。
    UpdateData() 用于控件和对象的数据交换
    UpdateData(true) 从控件上获取数据
    UpdateData(false) 设置数据道控件上

  • MFC和SDK的关系是什么,它的基类名称为什么。
    MFC是SDK的C++封装, CObject

  • 对话框分为哪两种,在SDK和MFC中分别怎样创建?
    模态对话框:
    SDK: DialogBox() MFC:doModal()
    非模态对话框:
    SDK: CreateDialog() MFC:create()

  • 想要改变当前窗口的显示方式可以使用哪个函数,怎样使用这个函数?
    ShowWindow(): SW_SHOW\SW_HIDE\SW_MINIMIZ\SW_MAXIMIZE

  • 使用SDK显示一个窗口,基本框架是什么?
    创建窗口类->注册窗口类->创建窗口->显示窗口->更新窗口->消息循环
    WNDCLASS->RegisterClass()->CreateWindow()->ShowWindow()->UpdateWindow()
    ->(GetMessage()->TranslateMessage()->DispathMessage())

  • 什么是队列消息?什么是非队列消息,怎样产生这两个消息?
    队列消息: 在消息循环中处理的的消息 PostMessage() 不阻塞
    非队列消息: 直接在回掉函数中处理的消息 SendMessage() 阻塞

  • 修改窗口的回调函数有几种方式,最好使用哪种?
    SetWindowLong()\SetClassLong() 推荐使用SetWindowLong()

  • MFC实现消息映射的原理是什么?依赖于哪两个宏?
    使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 维护了一个数组,保存了所有需要相应的消息和对应的函数

  • 在编写MFC程序时,用户代码的入口是哪个函数?
    CMyApp.InitInstance() 虚函数

  • 消息分为几种,分别是什么,用于哪些环境下?
    窗口消息 WM_...... 直接被窗口响应
    控制消息 WM_COMMAND 由简单控件转发给窗口
    通知消息 WM_NOTIFY 由通用控件转发给窗口

  • 二叉树的前中后序变量
    根左右 左根右 左右根

  • 逆序输出链表中的数据
    void show(Node* node)
    {
    if (node != null)
    {
    show(node->next);
    printf("%d", node.i);
    }
    }

  • 链表和顺序表的比较
    链表:空间可以是不连续的,不支持随机存取,链表的插入和删除时间复杂度为O(1)
    顺序表:空间是连续的,随机存取的时间复杂度为O(1)
  • 以上是关于C指针(2):指针的长度和类型的主要内容,如果未能解决你的问题,请参考以下文章

    c 复习

    c 复习

    c 复习

    C/C++ 内存与指针

    C中指向可变长度数组的指针的类型是啥?

    C语言 如何给指针数组划分动态存储空间