iOS学习笔记---c语言第八天
指针
首先将变量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 = 3; 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[5] = {10,78,25,56,24}; int *p = arr; *(p+2) = 52;//间接操作 arr[2] = 52;//直接操作 for (int i = 0; i<5; i++) { printf("%d ",arr[i]); }
数组名是一个常量指针 不能被修改 下面是错误写法 arr=p; //arr是常量数组名,p是指针变量
指针与数组的区别
1.所占空间不同
-指针:只于操作系统位数有关
-数组:与元素个数和类型有关
2.数组名是常量地址,不能被赋值
思考:数组元素类型和指针类型不匹配会怎么样?
short a[4] = {3,7,9,1}; 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+1) = 'v';//操作单个字符 printf("%s",p + 1);//操作整个字符串 //输出vphone
指针数组
存放指针的数组为指针数组
eg:char *string[3] = {"ios","android","win8"};
char *p1 = "iOS"; char *p2 = "Android"; char *p3 = "win8"; char *string[3] = {p1,p2,p3}; //char *string[3] = {"iOS","Android","win8"}; for (int i = 0; i<3; i++) { printf("%s ",string[i]); } printf("\n %c",*(string[1]+4));//输出o printf("\n %c",string[1][4]);//输出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 = 10,b = 20; // swap(a,b); swap2(&a, &b); printf("a = %d b = %d",a,b);
swap不能使a,b交换,,,swap2可以使a,b交换