[C++]指针
1. 指针的用处链表2. 指针的定义2.1. 基本概念指针就是指向一个变量或者指针的变量,它里面存储的值是一个内存空间的地址。 当然,一个指针也可以指向指针。 2.2. 代码实现int i = 3; int *p = &i; int **q = &p; cout<<p<<" "<<*p<<endl; cout<<q<<" "<<*q<<" "<<**q; 本程序的输出结果可能是: 0x22fec8 3 0x22fec4 0x22fec8 3 Hint: 大家可以举一反三,还可以定义很多其他类型的指针(比如char,double,long long······),都是同一个原理。 3. 指针进阶之交换两个数的值3.1. 代码1void change(int x,int y){ int t=x; x=y; y=t; } //main int a=1,b=2; change(a,b); cout<<a<<b; 输出 1 2 为什么a和b没有交换呢,这是因为当我们把a和b传到函数change的时候,参数x和y相当于只是把参数复制了一遍,并没有改变a和b的值。 3.2. 代码2void change(int *x,int *y){ int t; t=*x; *x=*y; *y=t; } //main int a=1,b=2; change(&a,&b); cout<<a<<b; 这样我们就可以将a和b的值交换了。 3.3. 代码3(difficult)void change(int *x,int *y){ int *t; t=x; x=y; y=t; } //main int a=1,&b); cout<<a<<b; 这一段代码也是做不到交换的,但是呢,有些人可能会问,这个也用了指针啦,上面那个代码怎么就可以这个代码就不行呢?其实他的主要原因就是由于我们知道函数的参数传进来的时候,编译器会把它的参数复制一份,我们这里呢,复制的是这个指针,但是交换的也是指针,所以还是只在函数内有效。 还没有听明白吗?看图。 最开始: 执行代码2 执行代码3 通过以上的图,我们就能很直观地了解到代码三是如何错的了。 3.4. 拓展代码4不知道大家刚才有没有注意到,我们在将a和b传递到函数change的时候,在前面加了一个&符号,这个符号的作用是取出变量的地址,所以它叫取址符。 void change(int &x,int &y){ int t=x; x=y; y=t; } //main int a=1,b); cout<<a<<b; 但是在上面代码中,参数 4. 数组中的指针指针不仅可以应用在变量中,它还可以应用在数组中,请看如下代码。 4.1. 用指针访问数组int a[5] = {1,2,3,4,5}; int *p; for(p = a; p < a + 5; p++){ cout<<*p<<" "; } 输出 1 2 3 4 5 在这个代码中,我们首先定义了指针 4.2. 数组与指针的关系数组其实就是一种特殊的指针,所以说访问数组也可以这么写: a[3] = 5; 等价于: *(a+3)=5; 数组由于是在内存中连续存储的,所以,而数组这个 3[a] = 5; 5. 结构体中的指针5.1. 定义结构体指针就是指向结构体的指针: struct node { int a; double b; long long c; }; //main node x; node *p=&x; 这时候 5.2. 使用怎么读取/写入结构体指针? 5.2.1. 读取用 //read int a = p->a; double b = p->b printf("%lldn",p->c); 或,如果你愿意写的复杂一点,可以: //read2 int a = (*p).a; double b = (*p).b; printf("%lldn",(*p).c); 5.2.2. 写入也差不多。 p->a = 123; p->b = 1.023; scanf("%lld",&(p->a)); 复杂的方法就不说了,大家可以举一反三。 6. 申请/释放内存指针申明后是没有内存空间的,必须申请后才有: #include <cstdlib> 6.1. 申请函数原型: void* malloc( std::size_t size ); 函数的参数就是要申请多少个字节(BYTE)的空间。 int *p = (int*)malloc(sizeof(int)); 结构体也可以这么用: node *q = (node*)malloc(sizeof(node)); 6.2. 释放函数原型: void free( void* ptr ); 函数的参数就是你刚才申请的指针。 free(p); free(q); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |