指针对于初学者往往是很难以琢磨的东西,因为它并不如变量那么抽象,而是更贴近底层的真实结构。指针操作往往会出现各种各样的岔子,最常见的便是”segmentation fault”。所以这里辨析了各种指针类型,实践出真知,下面的例子如果自己敲下来就更好了
#include
using namespace std;
class Rectangle{
public:
Rectangle(int length, int width){chang=length; kuan=width;}
void SetLength(int length){ chang=length;}
int GetLength() const{ return chang;}
private:
int chang;
int kuan;
};
int main(){
// int a=123;
// const int *p=&a;//const 修饰*,p可以改
// cout<<*p<GetLength()<GetLength()<GetLength()<GetLength()<SetLength(789);//非const方法也可以调用
cout<GetLength()<
a代表首地址,在sizeof和&a时当成了数组整体
#include
using namespace std;
#define sz(type) cout<
注意与一维指针类比区别开来。
指针有减法和比较运算,没有加法运算。
#include
using namespace std;
#define sz(type) cout<
使用swap(交换两个变量的值)作为演示,实现Swap的四种方法。当数组名作为函数的参数来传递的时候,他的高贵的数组结构特性已经失去了,成了一个地地道道的只拥有4个字节的平民。
#include
using namespace std;
#define SWAP(a, b, temp) (temp=a, a=b, b=temp);
void func(int *x, int *y){
int z=*x;
*x=*y;
*y=z;
}
void func1(int &x, int &y){
cout<
void Swap(T &a, T&b){
T temp=a;
a=b;
b=temp;
}
int main(){
float a=12.1, b=13.2;
cout<
要作为返回值,必须保证调用后返回的指针不会销毁,否则就是野指针。
#include
using namespace std;
int a[3];//全局变量默认初始化为0
int * func(){
return a;
}
int main(){
int a=1;
cout<
1、str和p是不相同的!!
#include
#include
int main() {
char str[3]="ab";
char *p=str;//此处可以修改str,因为str只是字符数组(使用了字符串字面量来初始化str),但是并不是常量
size_t length = std::strlen(str);//遇到'\0'才会停止计数
// 例如 char a[3]={'a', 'b', 'c'}, 使用strlen后的长度不是3!!!
printf("%c-%s-%ld-%ld\n", *str, str, sizeof(str), strlen(str));
// sizeof(str) 返回的是数组占用的内存大小,而 strlen(str) 返回的是字符串的长度。
printf("%c-%s-%ld-%ld\n", *p, p, sizeof(p), strlen(p));
// sizeof(p) 返回的是int型指针占用的内存大小,而 strlen(p) 返回的是字符串的长度。
*p='A';
*(p+1)='B';
std::cout<<*str<<*(str+1)<
2、此处会有一个warning,因为“ab”是存储在常量区域的,不能修改,在使用时需要使用const来申明
#include
#include
int main() {
char *p="ab";// 先在常量区保存好"ab",然后在栈区建立一个char *
// const char *p="ab";
printf("%c-%s-%ld-%ld\n", *p, p, sizeof(p), strlen(p));
// sizeof(p) 返回的是int型指针占用的内存大小,而 strlen(p) 返回的是字符串的长度。
*p='A';
*(p+1)='B';
std::cout<<*p<<*(p+1)<
3、此处会显示error: assignment of read-only location ‘* p’
#include
#include
int main() {
const char *p="ab";
printf("%c-%s-%ld-%ld\n", *p, p, sizeof(p), strlen(p));
// sizeof(p) 返回的是int型指针占用的内存大小,而 strlen(p) 返回的是字符串的长度。
*p='A';
*(p+1)='B';
std::cout<<*p<<*(p+1)<
4、字符数组指针的初始化
#include
#include
using namespace std;
int main() {
char a='a';
char b='b';
char *p=&a;
char c[]={a, b, 'c'};
printf("%p--%p--%c--%c\n", &a, &b, a, b);
printf("%p--%p--%c--%c\n", c, c+1, *c, *(c+1));
char *p2[]={&a, p, c};
for(int i=0; i<3; i++){
printf("%p--%p--%c\n", &p2[i], p2[i], *p2[i]);
}
return 0;
}
主要要把指针括起来
#include
using namespace std;
void func(){
cout<<"func"<
#include
using namespace std;
void func(){
cout<<"func"<
!!!!!!!!!!!!!
#include
using namespace std;
void func(){
cout<<"func"<
#include
using namespace std;
#define sz(type) cout<
#include
#include
using namespace std;
struct Stu{
int a;
char c[13];
};
int main(){
Stu s;
s.a=12;
strcpy(s.c, "121");
cout<a=11;
strcpy(pStu->c,"qwe");
cout<a<<"---"<c<