奇葩指针的集锦
以下都是自己想的,经过程序的运行,结合学过的知识,来总结的乱七八糟的(不一定对的)小知识,俗称野路子
1.char a; &a可作为指针
本来指针在底层就是指向地址的,C语言的&又是取地址符号,就都是地址了,,,就可以通用
strcpy()函数原型:
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
vs2015中如果要用strcpy的话
工程属性——C/C++——常规,里面有个SDL选项,关了。
工程属性——C/C++——代码生成,安全检查选项(/GS),关了。
或在项目-属性-配置属性-c/c++-预处理定义里改成—_CRT_SECURE_NO_WARNINGS
int main() { char * str = "qwe"; char a; strcpy_s(&a,4, str);//这里&a就相当于指针了,反正代表的是地址 std::cout << &a << std::endl;//这样输出更加验证是作为指针的形式。。。 std::cout << *(&a + 1) ; system("pause"); }
VS2015运行截图
/* 这是后来添加的*/
其实上面的就是正常的用法
正常的:int i;
int * p = &i;
只不过没有新建一个指针,少了一步赋值
2.强制类型转换指针
*(int * )100 = 25;
强制类型转换把整型值100从“整型“转换为”指向整型的指针“; 这里的”100“代表的是地址;
3.函数指针
int *f();代表函数返回一个指向整型的指针;f先与调用函数操作符()结合,所以f是一个函数
但是加一个括号,
int (*f) ();这时候f先与*结合,所以f是个函数指针,指向的函数返回一个整数值;
栗子:
建立个函数 int fff(int );
然后赋值给 函数指针, int (* pf) (int) = &fff;
函数指针的用法:
int ans;
ans = f(25);
ans = (*pf) (25);
ans = pf(25);
重点是这三种用法效果是一样的!!!
4.强制转换内存
比如(int &)a; 这个是将a 的引用强制转换为整型,意思是a所在的内存的数据,以整型来解析。
因为内存里数据反正都是二进制,
(也就是说a所在的内存地址中的数据本来是按float型存储表示的,你非要按int型来解释不可)。
1.0f 在内存中的存储为 0 011 1111 1 000 0000 0000 0000 0000 0000
把他按整型数解释为2^29+2^28+2^27+2^26+2^25+2^24+2^23=1065353216
(int&)a 相当于
*(int*)&a
*(int*)(&a)
*((int*)&a)
float类型在内存中存储的形式自己搜 (好像是组成原理学过,然后现在呵呵,忘了)
5.指向未知类型的指针
(void *)
6.指针与const
int *p; //普通指向整型的指针
int const * cpi; //指向整型常量的指针,可以修改指针的值,但是不能修改它指向的值
int * const pci; //指向整型的常量指针,不可以修改指针的值,但是能修改它指向的值
int const * const cpci;; //指针和指向的值都是常量,不能被修改