指针一直以来都是一个大问题,似懂非懂,今天又懂了一丢丢,赶紧记录下来
1.怎样引用指针变量:
a.给指针变量赋值:p=&a;//把a的地址赋给p
b.引用指针变量指向的变量:
p=&a;
printf(“%d\n”,*p);指针变量p所指向的变量值是变量a的值。
如果下面有语句*p=1,则a=1.
c.引用指针变量的值:printf("%d\n",p);相当于输出&a(*p=a,p=&a两个要注意区分啊)
首先定义了int *p,p是指针变量,而不是*p是指针变量,int*p表示p是指向int型的指针变量。
int *p;int a = 1;
p = &a; // 指针变量p指向整形变量a,
printf("%d\n",*p)-->1
printf("%d\n",p)-->是一个地址(p是指针,指针就是地址)
printf("%d\n",&a)-->是一个地址
输出&a,,,,,,*p,,,,,,,,p,,,,,,,都是不一样的结果。
&a是取地址,*p是取出内容,*p=a=1;---》(注意看到有符号*的就是取出内容)
2.通过指针引用数组
a.数组名就数组首元素的的地址:p=&a[0] //p的值就是a[0]的地址
而不是代表整个数组 p=a; //p的值就是数组a首元素a[0]的地址
b.如果指针变量p已经指向数组的一个元素了,则p+1表示指向同一数组中的下一个元素
如果a是一个数组,*a=a[0];
a+1指的是首元素地址移动一位,指向a[1],------》a[i]=*(a+i)
&a+1表示整个数组移动1位。
c.注意:*(a+i)=a[i];
3.通过指针引用字符串
a.有些字符数组没有名字,不能通过数组名来引用,只能通过指针变量来引用。
对字符指针变量string 初始化,实际上是吧字符串第1个元素的地址赋给指针变量string,绝对不是吧字符串放到字符指针变量里面去
char*string ="i love china"; //string 指向字符串的第一个字符
printf(”%s\n”,string); //输出的是i love china,虽然string指向的是字符串的第一个字符,但是会输出第一个字符串之后的所有字符
b.可以通过字符数组名或者字符指针变量可以输出一个字符串,但是对于一个数组型数组就不可以通过输出数组名来获取数组里的所有数据。
c.赋值方法:可以对字符指针赋值,但是不能对数组名赋值
//字符指针变量赋值
char*a="i love china";
或
char *a;
a="i love china";
//数组的初始化
char str[14]="i love china";-------->正确
、、、、、、、、、、、、、、、、、、、、、、、、
char str[14];
str[]="i love china"---->错误的
4.指向函数的指针
、、、、、、、、、、、、、、、、、先这么多,后面还有一些不是很懂
NULL只是一个概念,叫作空值,其值本身没有任何含义,可以用0代替,也可以用1,...代替,只要这些值不会与系统实际的有效地址冲突即可。
char*str=NULL;
初始化为空指针,这个时候str的值为0x0;
空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。空指针用0表示,C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL. 程序里可以写 p = 0; 或者 p = NULL; 两种写法都把p置为空指针值。相对而言,前一种写法更容易使读程序的人意识到这里是一个指针赋值。