一、声明指针变量空格不影响定义一个整型类型的指针变量 pp为变量名。int *p; // int * p; // int* p;二、取值符 int a 6; printf(%d ,a); // 打印变量 a 的地址以十进制的格式%p 常用为取地址/内存地址的打印格式。三、地址赋值p是地址*p是值。【在指针变量 p 声明以后使用 *p 时都表示的是 解指针所以表示的是值】int a 6; int *p; // 将 a 的地址值取出来赋值给 p 或者说 将 p 的地址指向 a 的地址 p a; // 此时 a p 地址相同说明值也相同随着这任意一个数的修改而修改 printf(%d,*p); // 6四、解指针的赋值除了声明为定义指针变量后面使用 *p 都为 解指针即为具体数据值。int a 5; int *p; p a; *p 520; printf(%d,*p); // 520 printf(%d,a); // 520普通变量 a 和指针变量 p 的值都为 520 因为 指针变量 p 的地址指向了 普通变量 a 的地址所以两者地址相同当修改其中一个变量的值时另一个变量也被修改了。【即对解指针的数据操作会作用到原来的变量上】#includestdio.h void swap(int *a,int *b){ // 形参接收 两个参数且为指针变量即接收地址 int temp *a; // temp 6 *a; 将 指针变量 a 的值解指针赋值给 temp *a *b; // *b 3,*a 3 将 指针变量 b 的值解指针赋值给 a (解指针) *b temp; // temp 6 *b 将 变量 temp 的值赋值给 指针变量 b (解指针) // 所以a 3,b 6 } int main(){ int a 6; int b 3; printf(%d %d ,a,b); // 6 3 swap(a,b); // 实参传入 两个参数为变量 a b的地址值 printf(%d %d ,a,b); // 3 6 }因为传入和接收的是两个变量的地址值所以在后续对指针变量的值修改时会影响到原来的变量值。当没有使用指针时#includestdio.h void swap(int a,int b){ int temp a; a b; b temp; } int main(){ int a 6; int b 3; printf(%d %d ,a,b); // 6 3 swap(a,b); printf(%d %d ,a,b); // 6 3 }为什么打印结果会一样呢因为传入的只是变量的值不是地址且在 swap ()函数当中a b 接收参数以后的作用范围 只在 swap()函数中起作用离开该函数之后就失效了。所以修改变量 a b的值时不影响 mian中的值不像使用 指针变量直接获取地址修改这个地址的内容从而使得原来的变量受到影响而被修改。五、数组指针int arr[3] {1,3,5}; // 数组不用取地址因为数组本身默认的就是首元素的地址也不用取值符 printf(%d ,arr); // 6487600 这里打印的是 数组 arr 的首地址不是数组整个数据 printf(%d ,arr[0]); // 6487600 取数组第一个元素的地址 // *(arr 1) 与 arr[1] 等价 // 3 这里的 1 指的是向后偏移一位找到下一个元素 然后再解指针获取值即这里为 3 printf(%d ,*(arr 1)); // 3 即打印数组的第二个元素数组下标从 0 开始 printf(%d ,arr[1]);*(p 1) 与 p[1]作用一样都可以做偏移运算。可以理解为数组就是指针指针也是数组但两者的区别是数组名不能为修改不能修改地址默认的是首地址即不能给他赋值成别的值但指针可以赋值成别的值。