java基础改学C++(六)指针(1)
// 指针。
#include <iostream>
#include <string>
using namespacestd;
//1. 指针的概念
//1.1 数据在内存中如何存取?
//系统根据程序中定义变量的类型,给变量分配一定的内存空间。字符型占1个字节,整型数占4个字节.....。内存区的每个字节都有编号,称之为地址。
//访问有两种方式:
//重要的话说三遍:变量的地址称为指针 变量的地址称为其指针
//1.2 变量的指针与指针变量
int main(){
int a =10;
int * p = &a; //&:取出a的地址
// 符号 * 在定义语句中只表示:变 量 p 的 类 型 是 指针。 理解:
(int *) p = & a ;
*p = 200;//p抓住了a的地址,直接对其原值操作。就像是java里的Integer类,抓住引用
cout<<*p<<endl;
p++;//p里面装的是地址、指针,数组中 p++就是指向下一个元素,比如原来装的 2000H,加一后变成 2004H(因为 int 4 Byte)
cout<<*p<<endl;
// 猜猜这个打印多少? 随机的!同时也造成了危险!示例:
char buffer[3];
const int test = 9;
buffer[3] = 10; //这样test的值就变成10了!因为buffer没有下标3,所以直接把那个内存位置上的变量给改了!内存中buffer【3】和test 相邻存储的(因为创建的时候很近。。。)
cout<<test; */
这个例子也说明了 const值是可变的。(我们本意不想让它变)
//我们访问了一个内存中可能完全不了解的值,那么也能修改某个位置上的值,尽管我们不知道这个位置上的东西重要与否,但是可以修改。
// 补充点东西 ++ -- *都是右结合的右结合的右结合的示例
//数组名就是数组的起始地址!再强调一遍,就是第一个元素的地址!
int a1[10] = {1,2,3,45,6,7,8,96,4};
int * p1 = a1;
* p1 = 10;
//这里 a1【1】= 10 了!
//而且, *(a1+1)与 a1[1]等同。
//注意:
// Demo:用指针的操作输出数组内容
for (p1 = a1; p1 < a1+10; p1++) {
cout<<*p1<<"\t";
}
for(int i=0;i<10;i++){
cout<<*p++<<'\t';
}
看个demo加深理解
下面是几个关于形参与实参的demo
第二个:
// 说个题外话,下面这种情况我的编译环境就报警告了:未指定顺序。不同电脑情况不同
// int v = 10;
// cout<<v<<(v++);
再补充点东西
不明白?看下面
好了,再来demo:
再来demo:
//总结:字符数组和字符指针变量都可以实现字符串的存储和运算,区别在于:
// 1. 字符数组名是常量,定义时必须指明占用的空间大小。
// 2. 字符指针变量是变量,里面存储的是字符型地址,可以整体赋值,但字符串必须以‘\0’结尾
最后做个练习巩固一下:
注意先自己写。
我是这样写的:
int main()
{
char st1[100] ="w?o?c?a?o?a!a!a!a!a!123a!!!!";
char st2[100];
int m=10;
void copy(char*p1,char *st2,int start);
copy(st1, st2, m);
cout<<st2;
}
void copy(char*p1,char *p2,int start){
p1+=start;
while((*p2++ = *p1++));
//C++是不是比java屌啊=======灵活度太他妈高了!!
}
怎么样,这才叫C++教程。一看就懂,一学就会。