15-指针
- sizeof
- 运算符&
- 指针
- 作为参数的指针
- 访问那个地址的变量*
- 指针与数组
- 数组与指针的区别
sizeof
- 是一个运算符,给出某个类型或者变量在内存中所占的字节数。
- sizeof(iint)
- sizeof(i)
- printf(“%ld”,sizeof());
运算符&
- scanf(“%d”,&i);里的&;
- 获得变量的地址,它的操作必须是变量
- int i;printf(“%x”,&i);
- 地址的大小是否与int相同取决于编译器
- int i ;peintf(“%p”,&i);
- &不能对没有地址的东西取地址
eg:&(a+b)、&(a++)、&(++a)、&(a+6) - 相邻的变量的地址,相差4个字节,且自上向下分配
- 数组的地址
a[10]
&a ==a== &a[0]
&a[0]与&a[1]相差4
指针
- 指针是保存地址的变量
int* p,q;
in *p,q;
这两种写法都表示:p是指针,q 是普通变量 - 普通变量的值是实际的值
指针变量的值是具有实际值的变量的地址
作为参数的指针
- void f(int *p);
- 在被调用的时候得到了某个变量的地址;
- int i = 0; f(&i);
- 在函数里面可以通过这个指针访问外面这个i(通过传入的地址,从而访问地址中的值,如果在函数里改变了这个地址里的值,则外面函数的值被改变)
访问那个地址的变量*
- *是一个单目运算符,用来访问指针的值所表示的地址上的变量
- 可以做右值,也可以做左值
int k = *p; //将p指向的值赋给k
*p = k+1; //将p指向k+1
指针与数组
- 函数参数表中的数组实际上是指针
sizeof(a) == sizeof(int*)
但是可以用数组的运算符[ ]进行运算 - 以下四种函数原型是等价的:
int sum (int *ar, int n );
int sum (int * , int );
int sum (int ar[ ] , int n );
int sum (int [ ] , int ); - 数组变量是特殊的指针
1.数组变量本身表达地址,所以
int a[10]; int *p = a; //无需用&取地址
2.但是数组的单元表达的是变量,需要用&取地址
a == &a[0];
3.*运算符可以对指针做,也可以对数组做
*a = *p = a[0]; //此处a是数组,p是指针
*a = 25 ;
4.[ ]运算符可以对数组做,也可以对指针做
p[0] == a[0]
5.数组变量可以看作是const的指针,所以不能被赋值
int b[ ] = a; //这种写法是错误的
int *q = a; //这种写法是正确的
//此处a是数组
int b[ ] = int *const b , b是一个常量,不能被改变,也就不能被赋值。也可以这样理解,b已经被定义在本地变量,他的地址已经固定,它被看作指针是指向自己本身的地址,自己本身的地址不能被其他的地址所代替,自然不能指向其他地址;
而第二个式子,此时a 代表数组a 的首地址,将指针q 指向a的首地址,与其相似的*q = *a,的意思是将数组a首地址的值赋给q所指向的地址
数组与指针的区别
下面用一个例子感受两者区别
定义数组:int a[10]; —>按理可看作 int *const a;
定义指针 : int *const p = a —>将指针p 指向a
定义二重指针: int *pa = &a ; int *pp = &p;
- 输出数组a 和指针p的地址:
a = %p , p = %p , a , p
结果: a = 65FDF0 b = 65FDF0
//二者都表示a的首地址- 输出数组pa 和指针pp的地址:
pa = %p , pp = %p , pa , pp
结果: a = 65FDF0 b = 65FDF8
//前者指向a,表a的地址;后者指向p,表p的地址- 输出数组pa 和指针pp所指的值:
*pa = %d , pp = %d , *pa , *pp
结果pa = 43 *pp = 65FDF0
//前者指向a地址,并访问a地址中的值也就是a;
后者指向p地址,解引用就是访问p地址存放的值,也就是a的地址- 输出*a 和 *p所指的值:
*a = %d , *p = %d,*a,*p
结果:*a = 43 , *p = 43
前者是直接访问本地的值,而后者是先访问p中存放的a的地址,才得到a的值- sizeof(a) == 20 , sizeof(p ) ==8
可以看出数组与指针所占的内存大小也不同,原因是数组a自定义所有单元都被分配了空间,而p被分配一个地址的空间
数组变量可以被看作是const的指针
const 指针变量虽然无法被改变,但可以被赋予变量的地址,同时还可以改变指向的变量的值
eg:
int a[3] = {1,2,3};
int *const b = a;
*b = 2;
printf(“a[0] = %d”,a[0]); //结果:a[0] = 2
以上写法是正确的,但是int c[3] = a,此写法是错误的,这是数组与指针不一样的地方.