1.字符指针的初始化

在c语言中 "string"保存的就是首个字符所在的地址  所以可以把 字符串常量"string" 赋值给指针 char *p;

char *s ="";

p="string"  但不能把字符串常量直接赋给数组,

char ch1[];
ch1="";

需要用到 strcpy。

strcpy_s(ch1,"");//VS2012用strcpy_s才过,是strcpy的安全版本

但可以对数组初始化为字符串,也就是字符数组。如  char str[] = "string";

两种初始化的区别:

char * p="the fine day" ;
char str[]="the fine day"

不同, 这两个都是给字符串的初始化,前者只是把字符串的首地址给str,没有分配足够的内存地址来保存整个字符串 , 后者初始化的同时,把他们保存在数组中,也就是分配好了所有字符需要的内存。 所以:

()  char *p = "string";    // 地址变量p 保存的是 's' 的地址,,
() char str[] = "the fine day"; //字符数组str保存的是整个字符串,某些情况下退化为指针
() char *str1 = "the day"; // OK.

此时,如果要复制另一个字符串str1 到p或str:

strcpy(p, str1);    //错误!   需改为  p=(char*)malloc( strlen(str1)+1 );  才正确
strcpy(str, str1); //没错误,已有足够内存,但不能总是保证。
strncpy(str, str1, strlen(str) ); //正确!不作讨论

实际上,(1)中是不对的,好像新标准已经会报错;
通常应该这样初始化:strcpy(p, "string");
或者改为:const *p = ""string";  但这样就不能修改p了。

针对这个分配的内存空间可能不足导致溢出的不安全问题,已经出了一个新的版本strcpy_s。具体参考其他日志。

另外补充一点,这样初始化时错误的

char *p ='a';//指针只能保存地址,不是保存值(字符a)

2.整形指针的初始化

试看下面语句哪一行 能够 打印输出?

int a = ;
int * p1 = ;
int * p2 = &a; //常见,初始化为某变量的地址
int * p3 = ;
printf("p1=%p, *p1=%d\n", p1, *p1);
printf("p2=%p, *p2=%d\n", p2, *p2);
printf("p3=%p, *p3=%d\n", p3, *p3);

这几行语句编译时会有警告:p3那一行将整数赋值给指针,没做类型转换。
运行时会导致崩溃。
为什么呢?

仔细看一下,int * p1 = 0;     //真的初始化了吗?
                     int * p3 = 20;    // *p3 初始化成20了吗?
其实int *p1 = 0 相当于 int *p1 = NULL,不能读取空指针 p1 以及 *p1 的值!,编译不会报错,但是运行时会报异常。
而 int *p3 = 20 相当于 int *p3;   p3 = (int *)0x00000014; 不能读取*p3的值。

C++指针初始化总结的更多相关文章

  1. C++中关于指针初始化和使用NULL的理解

    1.严禁使用未被初始化的指针:C++创建指针的时候,只分配存储地址的内存,并不会分配存储数据的内存,所以指针可能指向任何位置. (1)使用解除运算符(*)之前,一定要对指针初始化,否则若声明的指针刚好 ...

  2. C++ 类的多态三(多态的原理--虚函数指针--子类虚函数指针初始化)

    //多态的原理--虚函数指针--子类虚函数指针初始化 #include<iostream> using namespace std; /* 多态的实现原理(有自己猜想部分) 基础知识: 类 ...

  3. 【C++】指针初始化

    1.Node * p:if(p)//报错 2.Node * p=NULL;if(p)//不报错 注意把指针初始化,否则指针将指向任意位置

  4. c语言结构体指针初始化

    今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...

  5. C语言结构体指针初始化(转)

    reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...

  6. C++ 指针初始化要注意的地方

    1. 声明多个指针的时候: int* P1,P2; 如上所示,声明的是创建一个指针P1和一个int型的变量P2.而不是声明的两个指针. 对每个指针变量名,都需要使用一个*. 在C++中,int* 是一 ...

  7. java 对象变量 c++对象指针 初始化对象变量的2中方法

    java 对象变量 c++对象指针 java null引用 c++ null指针 Date deadline  是 对象变量,它可以引用Date类型的对象,但它不是一个对象,实际上它也没有引用对象. ...

  8. C++类指针初始化

    上面的代码会打印“A”. C++ 类指针定义的时候没有初始化的时候,居然可以安全的调用类内部的成员函数而不出错. 在网上查了一下:   初始化为NULL的类指针可以安全的调用不涉及类成员变量的类成员函 ...

  9. 关于vptr指针初始化的分步

    vptr:一个具有虚函数类的对象所具有的隐藏的成员,指向该类的虚函数表. 父类对象的vptr指向是一直指向父类的.但子类的vptr指针最终是指向子类的, 当子类创建的时候,先调用父类构造函数,这个时候 ...

随机推荐

  1. iOS之即时通讯相关理解

    Socket: 1>Socket又称"套接字" 2>网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 3>应用程序通常通 ...

  2. WebService-使用JDK开发WebService

    一.使用JDK开发WebService 2.1.开发WebService服务器端 1.定义一个interface,使用@WebService注解标注接口,使用@WebMethod注解标注接口中定义的所 ...

  3. Building bridges_hdu_4584(排序).java

    Building bridges Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

  4. maven 打包源文件

    1.The source plugin can be used to create a jar file of the project sources from the command line or ...

  5. [RxJS] Combining Streams with CombineLatest

    Two streams often need to work together to produce the values you’ll need. This lesson shows how to ...

  6. Win32多线程编程(2) — 线程控制

    Win32线程控制只有是围绕线程这一内核对象的创建.挂起.恢复.终结以及通信等操作,这些操作都依赖于Win32操作系统提供的一组API和具体编译器的C运行时库函数.本篇围绕这些操作接口介绍在Windo ...

  7. 支持多QQ登录的软件

    支持多QQ登录,批量加好友,批量回复QQ消息,当然也能接收 下载链接:多QQ登录软件

  8. JS基础函数

    函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块 <script> function demo(){ var a = 10; var b = 25; var sum = a + ...

  9. 开始学javascript基础

    JavaScript非常值得我们学习. 1)所有主浏览器都支持JavaScript. 2) 目前,全世界大部分网页都使用JavaScript. 3) 它可以使网页呈现各种动态效果. 4)作为一个Web ...

  10. ajax例子

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...