指针
一:指针代码示例
代码
#include <stdio.h>
int main(){
int a=1025;
int *p;
p = &a;
printf("size of integer is %d bytes \n",sizeof(int));
printf("Address = %d, value = %d\n",p,*p);
printf("Address = %d, value = %d\n",p+1,*(p+1));
char *p0;
p0 =(char*)p;//typrcasting (类型转换)
printf("size of char is %d bytes \n",sizeof(char));
printf("Address = %d, value = %d\n",p0,*p0);
printf("Address = %d, value = %d\n",p0+1,*(p0+1));
//1025 = 00000000 00000000 00000100 00000001
}
运行结果
size of integer is 4 bytes
Address = 6487564, value = 1025
Address = 6487568, value = 0
size of char is 1 bytes
Address = 6487564, value = 1
Address = 6487565, value = 4
小结:
-
int类型的大小是4 bytes
-
char类型的大小是1 bytes
-
&是地址运算符:&a表示a的地址
-
*是间接(或解引用)运算符:示例
a = 2; ptr = &a; //ptr是指向 a 的指针,把a的地址符赋给 ptr c = *ptr; //把ptr指向的地址上的值赋给 c
最终结果是把2赋给了c
-
因为p是指向整形的指针,而p0是一个指向字符的指针
p0 =(char*)p; //做的是类型转换
- 最后打印出*p0的值是1
printf("Address = %d, value = %d\n",p0,*p0);
是因为*p是char类型,只占1个 bytes ,而p是int 类型有4 个bytes,1025= 00000000 00000000 00000100 00000001 *p中就只能读取1个字节也就是 00000001,所以最后的结果是1
- 最后*p0+1的结果是4
printf("Address = %d, value = %d\n",p0+1,*(p0+1));
是因为p0+1 把我们带到下一个字节,也就是 00000100 ,这个字节的值就是4
二:指针指向指针
代码
//指针指向指针
#include <stdio.h>
int main(){
int x=5;
int *p;
p = &x;
*p = 6;//更改了x的值
int** q;
q = &p;// 创建一个q来存放p的地址 ,q指向p,q的类型是int**
int*** r;
r = &q;
printf("%d\n",*p);
printf("%d\n",*q);
printf("%d\n",*(*q));
printf("%d\n",*(*r));
printf("%d\n",*(*(*r)));
***r=10;
printf("x = %d\n",x);
**q = *p +2;//*p的解引用是x,**q也是解引用x
printf("x = %d\n",x);
//如果比定义时少一个*那输出时就代表地址,不少就表示是数值
}
运行结果
6
6487572
6
6487572
6
x = 10
x = 12
-
*p = 6;
表示更改了x的值
-
int** q; q = &p;
表示建一个q来存放p的地址 ,q指向p,q的类型是int**
-
**q = *p +2;
*p的解引用是x,**q也是解引用x ,就相当于对x加二
-
如果比定义时少一个*那输出时就代表地址,不少就表示是数值
三:把指针作为参数函数(传引用)
代码:
#include <stdio.h>
void Increment(int *p)//p是形参 ,因为p是指针,所以存放的是被调用过去 a 的地址
{
*p = *p+1;// p指向 a ,所以 p所指向的内存的值会加 1
}
int main(){
int a;//a是局部变量,只能在这个函数里面使用这个变量
a=10;//这个'a'是在main函数中的 ,main是主调函数,Increment是被调函数
Increment(&a);// a是实参
printf("a = %d",a);
}
输出结果:
a = 11
-
void Increment(int *p)
p是形参 ,因为p是指针,所以存放的是被调用过去 a 的地址
-
*p = *p+1;
p指向 a ,所以 p所指向的内存的值会加 1
-
a是局部变量,只能在这个函数里面使用这个变量
-
main是主调函数,Increment是被调函数
-
Increment(&a);
a是实参
四:针和数组
代码:
#include <stdio.h>
int main(){
int A[] ={2,4,5,8,1};
printf("%d\n",A);//首元素的地址
printf("%d\n",&A[0]);
printf("%d\n",A[0]);
printf("%d\n",*A); //首元素地址的数值
}
输出结果:
6487552
6487552
2
2
- 表示地址:&A[i] or (A+i)
表示数值:A[i] or *(A+i)
#include <stdio.h>
int main(){
int A[] ={2,4,5,8,1};
int i;
for(i=0;i<5;i++){
printf("Address = %d\n",&A[i]);
printf("Address = %d\n",A+i);
printf("value = %d\n",A[i]);
printf("value = %d\n",*(A+i));
}
}
- 可以把数组赋给指针,从而让指针加1,写成p++,数组不能加1,写成A++,数组A自身不能进行自增
int *p = A;
p++;
标签:p0,int,Address,value,day1,printf,指针
From: https://www.cnblogs.com/ninnne/p/17580059.html