//main.m
#import
#import "Array.h"
#import "Change.h"
int main(int argc, const char * argv[])
{
//定义指针变量
// int a = 10;
// float b = 5.0;
// char c = 'a';
// a = 20;
// printf("%d\n",a);
//
// int *p = NULL;
// //定义了一个数据类型为 int* 变量名为 p 初始值为 NULL 的一个指针变量
// //指针变量是一个存储了地址的变量
// //int * 为数据类型;
// //int 指的是 p 需要指向一个整型的变量(存储的是整型变量的地址);
// // * 是告知变量 p 是一个指针;
// // NULL 指的是一个无效的地址空间,赋初值;
// //指针变量的存储空间大小和系统有关,64位系统下是8个字节;
//
// printf("%lu %lu",sizeof(int *),sizeof(p));
// //指向浮点型的地址
// float *p_1 = NULL;
// printf("%lu %lu",sizeof(float *),sizeof(p_1));
// //指向字符型的地址
// char *p_2 = NULL;
// printf("%lu %lu",sizeof(char *),sizeof(p_2));
//
// & : 取地址符
// p = &a; //将 a 的地址赋值给 p, 那么 p 指向 a
// p_1 = &b; //将b 的地址赋值给 p_1 ,那么p 指向 b
//
// printf("\np = %p, a的地址%p",p,&a); //打印后 p 等于 a 的地址
//
// // * : 取值符 (获取对应地址的值,当然也可以对对应地址内存赋值)
// // 关于取值还是赋值 根据"="来判定,,=左赋值
// printf("\n a = %d , *p = %d",a ,*p);
// *p = 40;
// printf("\n%d",a);
//
// //*(&a) * 和 & 是一对相反互逆的过程符号
// printf("a = %d",*(&a));
//
//指针变量的算术运算
// int a = 1;
// int *p = &a;
// printf("p = %p\n",p);
// //对指针一次性改变的增量跟指向的数据类型有关,比如 int 一次 4个字节
// p++;
// printf("p = %p\n",p);
//
//
// char c = 'a';
// char *p_1 = &c;
// printf("p_1 = %p\n",p_1);
// p_1++;
// printf("p_1 = %p\n",p_1);
// p_1 = p_1 - 2;
// printf("p_1 = %p\n",p_1);
// p = p - 2;
// printf("p = %p",p);
//
//重指向
// int num = 0;
// p = #
//
//指针与数组
// int a[5] = {1,2,3,4,5};
// int *p =NULL;
//
// printf("a = %p,&a[0] = %p\n",a,&a[0]);
// p = a; //因为数组名代表数组的首地址,我们将a 赋值给 p 就是将数组的首地址给 p,p 就指向数组 a
//
// //访问数组第2个元素
// a[1];
// *(p + 1);
// *(a + 1);
// p[1]; //如果指针变量指向数组,那么指针变量可以当做数组名来使用.
// printf("%d,%d,%d",a[1],*(p+1),*(a+ 1),p[1]);
// // a[1] 与 1[a] 同样表示
// // a[1] == *(a + 1) == *(1 + a) ==1[a]
//
//
//
// //使用指针变量 p 对数组 a 进行遍历输出
// for (int i = 0; i < 5; i++) {
// printf("%d ",*(p + i)); //或者 *(p + i) 替换成 p[i].
// }
//
// //使用指针变量进行冒泡排序
//
// for (int i = 0; i < 5 - 1 ; i++) {
// for (int j = 0; j < 5 - 1 -i; j++) {
// if (*(p + j) > *(p + j + 1)) {
//
// int o = *(p + j);
// *(p + j) = *(p + j + 1);
// p[j + 1] = o;
// }
// }
//
//
// }
//
// for (int i = 0; i < 5; i++) {
// printf("%d ",p[i]);
// }
//
//
//
//指针和数组的区别
// int a[5] = {1,2,3,4,5};
// int *p =NULL;
//
// //内存大小
// //数组的内存大小 = 每个元素内存大小 * 数组元素个数
// //指针内存大小只和操作系统有关,跟指向的数据类型无关
// p = a;
// printf("a size = %lu , p size = %lu",sizeof(a),sizeof(p));// 20 , 8
//
// //赋值
// //指针变量是一个变量,可以重新赋值
// //数组名,是一个常量,表示第一个元素,不可以赋值
// int b[10] = {0};
// p = b;
// //a = b; 是错误的
//
// short c[5] = {2,3,4,5};
// int *p_1 =NULL;
// short *p_2 = NULL;
// char *p_3 = NULL;
//
// //指针变量存储的变量地址的数据类型一定要匹配,
// p_1 = c;
// p_2 = c;
// p_3 = c;
// printf("\np_1[0] = %d,p_2[0] = %d,p_3[0] = %d",*p_1,*p_2,*p_3);
//指针和字符串的关系
// char ch[20] = "iphone6";
// char *p = ch; //p 指向 ch数组
//
// for (int i = 0; i < 20 ; i++) {
// printf("%c ",*(p+i));
// }
// printf("\n%s",p);
//
// printf("%d ",myStrlen(p));
//
//
//
//指针数组
// char ch_1[20] ="iOS";
// char ch_2[20] ="C++";
// char ch_3[20] = "C++++";
// char ch_4[20] = "java";
//
// char *ch[4] = {ch_1,ch_2,ch_3,ch_4};
//
// //遍历指针数组
// for (int i = 0; i < 4; i++) {
// printf("%s ",ch[i]);
// }
//
//
//
// char *p_1 = "iOS";
// char *P_2 = "C++";
// char *p_3 = "C++++";
// char *p_4 = "java";
//
//
//
//
// strcpy(p_1, "aa");//其实在这个时候 p 直接指向常量区的字符串或者数字,是不可以改变的
// //如果在上面 式子中,先把"iOS"给了数组,数组内容中的"iOS"是从常量中拷贝而来的,所以如果去改变指向变量的话,可以做到
// char a[80]="jasdofiewofnaidshadfkjagoiasdfewnjfsdioucasmfbh";
// char *p_5 ="jasdofiewofnaidshadfkjagoiasdfewnjfsdioucasmfbh";
// //以上两个用法是都可以实现的,因为 p_5指向的是这个字符串,完全不用考虑因数组越界的问题了.
//
//指针函数
// int a = 5;
//
//
// changenum(a);
// printf("a = %d",a);
//
// changenumber(&a);
// printf("a = %d",a);
//
//
return 0;
}
// Change.h/Change.m
Change.h
#import
void changenum(int a);
//void changenumber(int *a);
Change.m
#import "Change.h"
void changenum(int a){
a += 10;
}
//void changenumber(int *a){
// *a += 10;
//}
//
//Array.h/Array.m
#import
//求长度
int myStrlen(char *p);
#import "Array.h"
//求长度
int myStrlen(char *p){
//计数器
int count = 0;
int i = 0;
while (*(p + i) != '\n') {
count++;
i++;
}
return count;
}