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. c指针点滴4-指针的值

    #include <stdio.h> #include <stdlib.h> void main() { ; int *p = &num; //double *p1 = ...

  2. <php>上传文件的程序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Java并发实现一(并发的实现之Thread和Runnable的区别)

    package com.subject01; public class ThreadOrRunnable { public static void main(String[] args) { Syst ...

  4. HBase二级索引的设计(案例讲解)

    摘要 最近做的一个项目涉及到了多条件的组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowK ...

  5. JMeter分布式性能测试

    利用JMeter进行负载测试的时候,使用单台机器模拟测试超过1000个行程的并发就有些力不从心,在执行的过程中,JMeter自身会自动关闭,要解决这个问题,可以使用分布式测试,运行多台机器运行所谓的  ...

  6. js点击打开弹窗

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. python进阶之路之文件处理

    Python之文件处理 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...

  8. git删除未跟踪文件

    # 删除 untracked files git clean -f   # 连 untracked 的目录也一起删掉 git clean -fd   # 连 gitignore 的untrack 文件 ...

  9. 获取Excel表中各个Sheet的方法

    获取Excel表中各个Sheet的方法 private void simpleButton2_Click(object sender, EventArgs e) { OfdBOM.Filter = & ...

  10. SQL中@@ROWCOUNT函数

    返回受上一语句影响的行数.如果行数大于 20 亿,请使用 ROWCOUNT_BIG. 语法 @@ROWCOUNT        返回类型 int   注释 Transact-SQL 语句可以通过下列方 ...