指针
首先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a,间接读写变量a的值。用来存放变量地址的变量,就称为"指针变量"
int *p=null; 初始值:null恒等于0 变量类型:整型指针 int *
指针变量所占字节数只于操作系统有关
指针类型转换符%p
printf("p = %p\n",p);
//c语言定义指针的时候,喜欢使用p,q,r等。
int *p = NULL;
//我们通常所说的指针,指的是指针变量
//指针变量时存放内存地址(内存编号)的变量。
printf("%p",p);
取地址符&
int a = 3; int *p = &a;
取值运算符*
int a = ;
int *p = &a;
printf("%d\n",*p);
char c = 'd';
char *q = &c;
printf("%c\n",*q);
指针的赋值代表指针的重指向。
指针的算术运算 只有加减运算
int*p = &a; 注意:指针类型决定移动几个字节
p++;//向高位移动四个字节
p--;//向低位移动四个字节
数组的内存地址
数组;用连续内存空间存储数据的构造类型 数组名:数组元素首地址
eg:int array[3]={1,3,8};//array 恒等于 &array[0]
int arr[] = {,,,,};
int *p = arr;
*(p+) = ;//间接操作
arr[] = ;//直接操作
for (int i = ; i<; i++) {
printf("%d ",arr[i]);
}
数组名是一个常量指针 不能被修改 下面是错误写法 arr=p; //arr是常量数组名,p是指针变量
指针与数组的区别
1.所占空间不同
-指针:只于操作系统位数有关
-数组:与元素个数和类型有关
2.数组名是常量地址,不能被赋值
思考:数组元素类型和指针类型不匹配会怎么样?
short a[] = {,,,};
int *p1 = a;
char *p2 = a;
printf("%d\n",*p1);
printf("%d",*p2);
//输出458755 3 从低到高 00000011 00000000 00000111 00000000 00001001 00000000 00000001 00000000
int *p1 中a变成 00000000 00000111 00000000 00000011 四个字节
char *p2 中a变成 00000011 一个字节
指针与字符串
字符指针可以操作单个字符,也可以操作字符串。
char string[] = "iphone";//string为数组名
char *p = string;//指向字符数组首地址
*(p+) = 'v';//操作单个字符
printf("%s",p + );//操作整个字符串
//输出vphone
指针数组
存放指针的数组为指针数组
eg:char *string[3] = {"ios","android","win8"};
char *p1 = "iOS";
char *p2 = "Android";
char *p3 = "win8";
char *string[] = {p1,p2,p3};
//char *string[3] = {"iOS","Android","win8"};
for (int i = ; i<; i++) {
printf("%s ",string[i]);
}
printf("\n %c",*(string[]+));//输出o
printf("\n %c",string[][]);//输出o
可以用指针修改字符数组,但不可修改常量字符串
指针函数
void swap(int x,int y) {
int temp = x;
x = y;
y = temp;
printf("x = %d y = %d\n",x,y);
}
void swap2(int *x,int *y)
{
printf("---*x = %d,*y = %d",*x,*y);
int temp = *x;
*x = *y;
*y = temp;
printf("---*x = %d,*y = %d",*x,*y);
}
int main(int argc, const char * argv[])
{
int a = ,b = ;
// swap(a,b);
swap2(&a, &b); printf("a = %d b = %d",a,b);
swap不能使a,b交换,,,swap2可以使a,b交换