奇葩指针的集锦

以下都是自己想的,经过程序的运行,结合学过的知识,来总结的乱七八糟的(不一定对的)小知识,俗称野路子

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;;  //指针和指向的值都是常量,不能被修改

    

posted @ 2016-08-23 17:37  黑炭BC  阅读(174)  评论(0)    收藏  举报