c 指针概括(学习笔记).
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1普通参数与指针参数都占用存储空间(若干字节),char 参数一个字节,char *指针参数也是一个字节;int参数4个字节,int *指针参数也是4个字节
2指针参数的存储空间有自己的物理地址,只是指针参数存储空间的内容为是普通参数的物理地址而已。
3指针定义后不用则罢,使用时之前必须赋值。
4.Int a;
Const int * pr=&a; (常量指针)
指向常量的指针:定义好指针后,赋值方向限制了,非常量指针双向都可以赋值(*pr、a)。
现在呢,只能通过a赋值,*pr不行了,因为常量不能被再赋值了。
不能修改*pr的值——————
Int * const pr;(指针常量)
此指针为常量:存储空间里的物理地址是个常量,不能再给给这个存储空间赋别的物理地址了。
但它指向的空间可以是任意赋值。
定义时必须初始化。
将指针的指向范围限制到一个地址。
不能修改pr的值——————
Const int * const pr;(指向常量的指针常量)
不能修改*pr的值——————
不能修改pr的值——————
5.
定义一个数组后,数组名称即数组的首地址
Int a[10],*pr;
Pr=a;
A[i]这时可以用pr[i]表示,或*pr表示(*pr仅表数组中一个数)
但在一个程序中使用*pr了,得同时要使用pr++,再不能使用pr[i]了,因为pr、i 都在递增,乱求了。
7.
字符串指针
Char a[]=”qsh”;
Char *pr=a;
Pr=”hello”;
Cout< 或者 cout<
a的输出值是“qsh”,不是“hello”,因为 pr="hello";只是将pr的地址重新定义了一下,没有改变A,qsh hello 都有各自的内存。
要是cout<<*pr;的话就指出来h,因为pr只代表一个地址。
*pr代表一个字符,因此也可以比较大小,知道=’\0’时,*pr=0
Void mystrcpy(char * dest,char * source
{while(*dest++=*source++;}
字符串定义之后,要改就用strcpy函数、cin函数、cin.getline(函数;
字符串指针定义之后,要改就用cin函数、cin.getline(函数、直接将字符串数组赋予。
也可直接将一个字符串赋予(如上面紫色粗体),但这样就改变了指针的指向(危险啊)。
8.
Q++后置就后计算;++q前置就先计算。
例:
int a[4]={100,200,300,400},b;
int *p=&a[0];
b=*p++; // b=*(p++; 结果一样,括弧形同虚设。
++后置则work finally.
9.地址的传递
函数里面值的传递不能反映到main函数里,只有地址的传递才可以。
10.空类型指针 void
NULL是空指针值,它不指向任何地方,与void *是不同的概念,null是个值,而void *是一种指针类型。
指针内要么有值,要么=0,即’\0’所以指针可以与0比较
1.
2.二维数组q[i][j]的第i行首地址是:
q[i] 或 &q[i][0] 或 *(q+i)
3.
Cin>>碰到“ ”空格就停止存入;
cin.getline(str2,80;输入多个字符。
4.数组的时候,每开始操作时先将数组首地址赋值于指针。
5.
定义了指向一维数组的指针变量p后,只要将二维数组a第i行的行地址a+i或&a[i]赋给p,即:
p=a+i; 或p=&a[i];
则可用(*p[0]、(*p[1]、…(*p[n-1]来表示数组a第i行的元素a[i][0]、
a[i][1]、…a[i][n-1]
例:
int a[3][4]={{1,2,3,3},{4,5,6,1},{7,8,9,4}};
int (*p[4]; //数组长度4必须与二维数组a[3][4]的列数4相同
p=&a[0];
6.
int a,* pr,i;
cout<<"please input a number:";
cin>>a;
pr=(int *malloc(a*sizeof(int;
free(pr;
malloc函数使分配内存空间,类似于定义一个数组也是自动分配了空间。
静态存储分配:在编译时进行的存储分配。
内存空间的大小,在程序运行过程中不能再动态改变
动态存储分配:在程序运行时根据需要进行的内存空间分配。
内存空间的利用率较高
New和delete
Int *a=new int; //4B
Int *a=new int[20]; //4*20B
Int *a=new int(34; //开辟4B空间后,存入数34
Char *q=new char; //1B
Char *q=new char(‘a’;
Char *q=new char[20];
虽然只分配了一个字节,并赋值以’a’,但字符串指针只要定义了,便可以赋值任何大小的字符串,他是指针,不在乎new分配了多少。
· 可以这么定义char q[]=”hello”; //然后使用q打头的存储空间
可以这么定义char q[]=”hello”,*qr=q; //然后使用qr打头的存储空间
但不可以这么定义char *qr; //因为只是定义1B的空间存储指针,而没有
Cin>>qr; // 指向,往里存东西也无从谈起。
可以这样char *pr=”qsh”; //先开辟内存存入qsh,再分配地址
也可以这样: char *qr=new char[20]; //然后只用qr打头的动态存储空间
delete 指针变量
delete [] 指向动态数组的指针。