免费版:死磕 C 语言指针
兜兜转转还是逃不过 C 语言,这该死的缘分。先看一眼我的西野七濑
学习自:该内容暂无法显示 - 知乎
目录
1 指针
1.1 指针是乜嘢
指针(pointer):一个值为内存地址的变量。
char 类型变量的值是字符,int 类型变量的值是整数,指针变量的值是地址。
1.2 指针的声明
数据类型 *指针名,这里的 * 表明声明的变量是一个指针,没有访问指针目标的含义。
int * pi; // pi是指向int类型变量的指针
char * pc; // pc是指向char类型变量的指针
float * pf; // pf是指向float类型变量的指针
指针存放的值是一个地址,在大部分系统内部,该地址由一个无符号整数表示,但不能把指针认为是整数类型。
- 指针变量不能赋予常量值
- 不能接受键盘输入的数据
1.3 运算符
间接运算符 *:访问地址的目标
val = *ptr; // 找出ptr指向的值
地址 & 运算符:取变量的存储地址
&num 表示变量 num 的地址。
1.4 简单的小例子们:
例子1
#include <stdio.h>
int main ()
{
int num = 97;
int *p; // 指针变量的声明
p = # //在指针变量中存储 num 的地址
printf("Address of var variable: %p\n", &num );
// 指针变量中存储的地址
printf("Address stored in ip variable: %p\n", p );
// 使用指针访问值
printf("Value of *ip variable: %d\n", *p );
return 0;
}
结果:
图解
例子2:指针在函数间通信
#include<stdio.h>
void interchange(int *u, int *v);
int main(){
int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x,y);
interchange(&x, &y);
printf("Now x = %d and y = %d.\n", x,y);
return 0;
}
void interchange(int *u, int *v){// 参数为指针,函数传递的是地址 ,u与v存的是地址
int temp;
temp = *u; // 直接改变对应地址存放的值
*u= *v;
*v= temp;
}
结果:
1.5 指针的运算
知识点:
- 三个操作符的优先级:() > [] > *,没错 * 是最卑微的
-
*p++ 里,* 号和 ++ 属于同一优先级,且方向都是从右向左的,*p++ 和 *(p++) 作用相同。
1.5.1 指针加减运算
#include<stdio.h>
void main(){
int a=10,b=20,c=30;
int *p=&b;
printf("%p\n",&a);
printf("%p\n",&b);
printf("%p\n",&c);
p=p+1;
printf("%p\n",p);
p=p-2;
printf("%p\n",p);
}
结果:
1.5.2 间址运算
*p++:* 与 ++ 同优先级,结合方向为自右向左,p++,先赋值再自加,因此结果等价于 *p 返回其值,p++
*++p:++p,先自加后赋值,等价于 p++, *p 返回其值
(*p)++:括号优先,等价于 *p 返回其值,然后将 *p 的结果 + 1
例:
#include<stdio.h>
int main(){
int a[] = {10,20,30}, *p=a;
printf("*p++ is %d\n", *p++);
p=a;
printf("*++p is %d\n", *++p);
p=a;
printf("++(*p) is %d\n", ++(*p));
p=a;
printf("a[0] is %d\n",a[0]);
printf("(*p)++ is %d\n", (*p)++);
return 0;
}