- 指针变量 :存放的是地址
- 普通变量 :存放的是数据
- 定义指针变量:
- 类型名 *指针变量名
- char *pa;//定义一个指向字符型的指针变量
- int *pb;//定义一个指向整型的指针变量
- 取地址运算符和取值运算符
1.1如果需要获取某个变量的地址,可以使用取地址运算符(&):
char *pa = &a;
int *pb = &b;
1.2如果需要访问指针变量指向的数据,可以使用取值运算符(*):
printf("%c,%d\n",*pa,*pb);
#include<stdio.h>
int main()
{
char a = 't';
int b = 134;
char *pa = &a;
int *pb = &b;
printf("a=%c\n",*pa);
printf("b=%d\n",*pb);
*pa +=1;
*pb +=1;
printf("now:a=%c\n",*pa);
printf("now:b=%d\n",*pb);
return 0;
}
输出结果:
a=t
b=134
now:a=u
now:b=135
2.避免访问未初始化的指针
/*未初始化的野指针,
指针变量pa到底指向哪不知道,
因此它的地址是随机的 ,
把一个随机的地址进行赋值有可能会覆盖到系统内一些关键性代码*/
#include<stdio.h>
int main()
{
int *pa;
*pa = 123;
return 0;
}
3.数组名是数组第一个元素的地址
4.指针的运算
当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做的意义相当于指向距离指针所在位置向前或向后的第n个元素。
5.对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法。
6.需要郑重强调的是:p+1并不是简单地将地址加1,而是指向数组的下一个元素。
7.数组名是一个地址常量,不能被改变 不能充当左值而指针变量可以是左值
8.C语言 的 lvalue用于识别或定位一个存储位置的标识符(左值同时还必须是可以改变的)
结论:数组名只是一个地址,而指针是一个左值
/*
计算字符串的长度
*/
#include<stdio.h>
#include<string.h>
int main()
{
char str[]="Chinese language!";
char *target=str;
int count=0;
while(*target++!='\0') //++优先级比*(取值运算符)高,但是本条语句显示++前的target值
{
count++;
}
printf("总共有%d个字符.\n",count);
return 0;
}