C++指针初始化总结
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++指针初始化总结的更多相关文章
- C++中关于指针初始化和使用NULL的理解
1.严禁使用未被初始化的指针:C++创建指针的时候,只分配存储地址的内存,并不会分配存储数据的内存,所以指针可能指向任何位置. (1)使用解除运算符(*)之前,一定要对指针初始化,否则若声明的指针刚好 ...
- C++ 类的多态三(多态的原理--虚函数指针--子类虚函数指针初始化)
//多态的原理--虚函数指针--子类虚函数指针初始化 #include<iostream> using namespace std; /* 多态的实现原理(有自己猜想部分) 基础知识: 类 ...
- 【C++】指针初始化
1.Node * p:if(p)//报错 2.Node * p=NULL;if(p)//不报错 注意把指针初始化,否则指针将指向任意位置
- c语言结构体指针初始化
今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...
- C语言结构体指针初始化(转)
reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...
- C++ 指针初始化要注意的地方
1. 声明多个指针的时候: int* P1,P2; 如上所示,声明的是创建一个指针P1和一个int型的变量P2.而不是声明的两个指针. 对每个指针变量名,都需要使用一个*. 在C++中,int* 是一 ...
- java 对象变量 c++对象指针 初始化对象变量的2中方法
java 对象变量 c++对象指针 java null引用 c++ null指针 Date deadline 是 对象变量,它可以引用Date类型的对象,但它不是一个对象,实际上它也没有引用对象. ...
- C++类指针初始化
上面的代码会打印“A”. C++ 类指针定义的时候没有初始化的时候,居然可以安全的调用类内部的成员函数而不出错. 在网上查了一下: 初始化为NULL的类指针可以安全的调用不涉及类成员变量的类成员函 ...
- 关于vptr指针初始化的分步
vptr:一个具有虚函数类的对象所具有的隐藏的成员,指向该类的虚函数表. 父类对象的vptr指向是一直指向父类的.但子类的vptr指针最终是指向子类的, 当子类创建的时候,先调用父类构造函数,这个时候 ...
随机推荐
- c指针点滴4-指针的值
#include <stdio.h> #include <stdlib.h> void main() { ; int *p = # //double *p1 = ...
- <php>上传文件的程序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Java并发实现一(并发的实现之Thread和Runnable的区别)
package com.subject01; public class ThreadOrRunnable { public static void main(String[] args) { Syst ...
- HBase二级索引的设计(案例讲解)
摘要 最近做的一个项目涉及到了多条件的组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowK ...
- JMeter分布式性能测试
利用JMeter进行负载测试的时候,使用单台机器模拟测试超过1000个行程的并发就有些力不从心,在执行的过程中,JMeter自身会自动关闭,要解决这个问题,可以使用分布式测试,运行多台机器运行所谓的 ...
- js点击打开弹窗
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- python进阶之路之文件处理
Python之文件处理 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...
- git删除未跟踪文件
# 删除 untracked files git clean -f # 连 untracked 的目录也一起删掉 git clean -fd # 连 gitignore 的untrack 文件 ...
- 获取Excel表中各个Sheet的方法
获取Excel表中各个Sheet的方法 private void simpleButton2_Click(object sender, EventArgs e) { OfdBOM.Filter = & ...
- SQL中@@ROWCOUNT函数
返回受上一语句影响的行数.如果行数大于 20 亿,请使用 ROWCOUNT_BIG. 语法 @@ROWCOUNT 返回类型 int 注释 Transact-SQL 语句可以通过下列方 ...