C语言指针

305 阅读3分钟

C语言指针

变量名、函数名、字符串名和数组名本质

C语言用变量来存储数据,用函数定义可以重复使用的代码,最终都要放到内存中供cpu使用。

cpu访问时需要的是地址,而不是你定义的变量命和函数名,变量名和函数名只是一种助记符,当源文件被编译和链接成可执行程序后,他们都会被被替换成地址。

需要注意的是,虽然变量名、函数名、字符串名和数组名本质上都是一样的,都是地址助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或者数据块的首地址。

指针和指针变量

指针:数据在内存中的地址称为指针

指针变量:如果一个变量存放来一份数据的指针,则称为指针变量

现在假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示)。另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们就称 p 指向了 c,或者说 p 是指向变量 c 的指针。

p是一个指针变量,该变量存放的是变量c的地址

定义指针变量

和定义普通变量类似,只需在变量名前添加*

datatype *name

int a = 100; 
//定义一个普通变量a 
int *p1 = &a; //定义一个int类型的指针变量 p1 并初始化 ,将a变量的地址赋给他
int b = 200; 
p1 = &b; // 修改指针变量

是一个特殊的符号,表明该变量是一个指针变量,再给其赋值时就没有必要再加

在不同的场景中*有不同的作用,定义指针变量时,表明这是一个指针变量,和普通变量相区分开;在使用指针变量时,前面加表示获取指针指向的数据

&取变量的地址

通过指针变量取得数据

int main()
{ 
int a = 15; 
int *p = &a;
printf("%d, %d\n", a, *p); //两种方式都可以输出a的值,通过变量名是直接获取数据,通过指针是间接获取数据
return 0; 
}

C语言指针的变量的运算(加减和比较)

指针变量的运算和数据类型相关

数组指针(指向数组的指针)

int arr[] = { 99, 15, 100, 888, 252 }; int *p = arr;

数组的名称arr本身就是一个指针:arr &arr[0] p 他们三个是等价的

数组指针指向的是数组中的某一个元素,而不是整个数组

int main(){
int arr[] = { 99, 15, 100, 888, 252 };
int len = sizeof(arr) / sizeof(int); //求数组长度 
int i;
for(i=0; i<len; i++){ 
printf("%d ", *(arr+i) ); //*(arr+i)等价于arr[i] } printf("\n"); return 0; }

使用指针变量数组

字符串指针

c语言没有特定的字符串类型,通常是将字符放在一个字符数组中

所以字符串指针和数组指针类似。