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语言没有特定的字符串类型,通常是将字符放在一个字符数组中
所以字符串指针和数组指针类似。