我的IOS学习历程 - 第八天
#import <Foundation/Foundation.h>
#import "Function.h"
今天主要讲的指针的运用
void Myswitch(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
#import "Function.h"
int main(int argc, const char * argv[]) {
字节是内存当中最小的存储单位
一个字节是八个二进制位
访问变量
1.直接访问: 通过变量名直接访问
2.间接访问: 通过变量的地址(内存编号)访问变量
指针变量: 保存的是地址
int *P = NULL;
声明指针变量的时候 * 没有特殊意义 只是告诉编译器 这是一个指针变量
int: 表示这个指针变量所指向的内存区域是一个整形的存储区域 也就是说 指针变量P指向的内存区域里面 储存的值是一个整形的
int a = 5;
// 声明一个指针变量
int *p = NULL;
// 指针变量p 指向 a的存储区域(地址)
// & 取地址符
// &a 取出变量a的地址
p = &a;
// 打印地址的占位符 %p
printf("%p\n",p);
printf("%p",&a);
// * 取值符
// *p 表示指针变量p所指向的地址 里面 保存的值
printf("%d\n",a);
// 通过指针变量*p来打印
printf("%d\n",a);
// 修改变量a的值
a = 3;// 直接访问
*p = 30; // 间接访问
// 打印指针变量占用的字节数
// 指针变量 占用8个字节 不管什么数据类型 只跟操作系统有关系
printf("%lu",sizeof(p));
// 指针变量的赋值相当于 指针变量的重指向
指针的运算
地址里面的值可以加减乘除
地址运算 只有加 减
地址加1 要看这个指针变量的数据类型
如果是int类型 +1 相当于 加4个字节
如果char类型 +1 相当于 加1个字节(什么类型就加多少)
int a = 3;
int *p = &a;
printf("%p\n",p);
p++;
printf("%p\n",p);
int a = 4;
int b = 5;
int *p = &a;
// 系统在分配内存时 不一定分配的是连续的
// 数组在分配内存的时候 肯定是分配的连续的内存区域
printf("&a = %p\n",&a);
printf("&b = %p\n",&b);
p--;// 相当于地址减4
printf("%d\n",*p);
需求: 编写一个函数 通过指针交换两个整形变量的值
int a = 3;
int b = 5;
Myswitch(&a, &b);
// 参数的传递 是实参向形参进行的传递 是一个拷贝的过程 是一个值的传递 地址是不一样的
// 交换时本着一个原则 操作的变量的地址 应该是一致的
printf("%d,%d",a,b);
指针与数组
int array[4] = {1, 3, 5, 7};
printf("%p\n",&array[0]);
printf("%p\n",array);
声明一个指针变量 指向数组(数组的首元素)
数组的名字本身就是数组的首元素的地址 不需要加取地址符
int *p = array;
printf("*p = %d\n",*p);
printf("*(p + 1) = %d\n",*(p + 1));
printf("%d\n",array[2]);
printf("%d\n",*(p + 2));
printf("%d\n",p[2]);
printf("%d\n",*(array + 2));
取出数组中的元素方法
array[下标]
*(array + 下标)
利用指针变量p取出数组元素
p[下标]
*(p + 下标)
需求:计算数组中的元素个数
数组中总得元素占的字节数 / 数组中单个元素的字节数 = 数组元素个数
int count = sizeof(array) / sizeof(array[0]);
array 代表的是整个数组
p 代表是指针变量
printf("%d \n",count);
通过指针变量p 不能求出数组元素个数
指针变量只占8字节 只跟操作系统有关
数组当函数参数时 传递的不是整个数组
传递的是数组元素的首地址 指针
函数的声明中 如果数组传入的时候就是传入的首地址 所以也需要输入元素个数来定义
short a[4] = {3, 7, 5, 1};// 按字节数来计算
int *p1 = a;
short *p2 = a;
printf("%d\n",*p1);
printf("%d",*p2);
指针与字符串
char str1[] = "iphone";
// char str2[] = {'i', 'p', 'h', 'o', 'n', 'e'};
char *p = str1;
// 1.利用指针打印字符串
printf("%s\n",p);
// 2.利用指针打印 h
printf("%c\n",*(p + 2));
// 3.把h更改成w
p[2] = 'w';
printf("%c\n",*(p + 2));
4.通过指针来计算字符串的长度
int n = 0;
while (p[n] != '\0') {
n++;
}
printf("%d\n",n);
char str[] = "wanglong";
// 声明个指针 指向字符串sr
char *p = str;
// 思路: 第一位 *(p + 0)
// 第二位 *(p + 1)
// * (p + i) == '\0'结束
int count = 0;
while (*(p + count) != '\0') {
count++;
}
printf("%d \n",count);
p[4] = 'x';
printf("%s",p);
char str[] = "iphone" ;// 这样直接写的话"iPhone"是常量字符串
但是可以更改 因为iphone 存在于常量区 而str[]是存在与栈区
相当于将常量区的常量字符串 拷贝一份到栈区
char *strings[3] = {"Ios", "Android", "WinPhone"};
// 这里的字符串都是常量字符串 想更改的话必须先声明一个字符串将其拷贝到栈区
// char str1[] = "Ios";// 这样的操作后就可以更改
// 指针数组中保存的都是同一类型的数据
// 输出所有字符串
printf("%s\n",strings[0]);
printf("%s\n",*strings);
printf("%s\n",*(strings + 1));
// strings[0] = "SOS";
// printf("%s\n",strings[0]);
// printf("%c\n",strings[0][1]);
// 如果你声明时 直接声明常量字符串 那么你是不能更改的 如果你声明时先声明一个字符串(这时这个字符串 是从常量区拷贝到栈区的字符串)
/*
指针变量是存放地址的变量,指针变量的
赋值,意味着指针的重指向。
数组名代表数组的⾸地址,⽽且是常量地
址,不可以修改。
函数调⽤时,形参拷⻉了实参的值。
*/
return 0;
}
浙公网安备 33010602011771号