对于指针
一、指针的细节:
()、对于一个变量a,&a是a的地址,创建一个指针*p,如果写 p=&a,则指针p指向a的地址,此时指针*p和a的值一样,为同一地址空间里的内容。
int a=100; //申请一个int型变量a;
int *p; //申请一个int型指针变量p;
p=&a; //指针变量指向变量a的地址(指向变量a的指针);
(2)、*p,为创建一个指针变量,p代表这个指针的地址,*p代表这个地址所存放的内容,具体的类型根据自己申请的指针变量的类型,如下:
float* p; //申请一个float类型的指针p
double* p; //申请一个double类型的指针p
long* p; //申请一个long类型的指针p
int* p; //申请一个int类型的指针p
char* p; //申请一个char类型的指针p
(3)、变量的地址叫做变量的指针;而存放地址的变量叫做指针变量(这个概念最好理解清楚);
(4)、指针变量自身也有一个地址,变量的值为指向的指针(即指向的地址);
(5)、 * :用来访问指针变量所存的地址的内容;
& :用来访问的是指针变量自身的地址。
注意:&可以取任何变量的地址,* 只对指针有效。同一优先级带*的话运算自右向左;
(6)、& 和 * 的优先级是一样子的,但是是按照自右向左运算;p = &a; &*p就是在求变量a的地址(自右向左,*p为a的值,&*p则为&a,即a的地址)。
(7)、对于int[3][4],*p=a[0];,指针p与二维数组的关系如下:
地址描述 | 意义 | 数组元素描述 | 意义 |
a、*a、a[0]、&a[0][0]、p | a的首地址 | **a、*p、*a[0]、a[ 0][0] | a[0][0]的值 |
*a+1、a[0]+1、&a[0][0]+1、p+1 | a[0][1]的地址 | *(*a+1)、*(p+1)、a[0][1]、*(a[0]+1)、 *(&a[0][0]+1) | a[0][1]的值 |
a+1 | a[1][0]的地址 | **(a+1)、*a[1]、a[1][0] | a[1][0]的值 |
a+i | a[i][0]的地址 | **(a+i)、*a[ i ]、a[ i ][0] | a[ i ][0]的值 |
*a+i*4+j、p+i*4+j、a[0]+i*4+j、&a[0][0]+i*4+j、&a[ i ][ j ] | a[i][j]的地址 | *(*a+i*4+j)、*(p+i*4+j)、*(a[0]+i*4+j)、a[ i ][ j ]、*(&a[0][0]+ i*4+j) | a[ i ][ j ]的值 |
指针p与二维数组的具体关系,去参考上一篇博客指针和二维数组哦,附上链接:http://t.csdn.cn/uythg
欢迎交流和提问,请在下方评论!
喜欢的话希望你的 点赞+收藏!
#include <stdio.h>
void main(){
printf("欢迎交流和提问,请在下方评论!\n");
printf("喜欢的话希望你的 点赞+收藏!\n");
}