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):指针的长度和类型的主要内容,如果未能解决你的问题,请参考以下文章