ios指针第二天

//
//  main.m
//  LessonPointerPro
////  Copyright (c) 2015年 池海涛. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Function.h"
#define PI 3.1415926
#define kMul(A,B) (A)*(B)

////条件编译
////形式1
//#ifdef PI
//#define kPPPI 0
//#else
//#define kPPPPI 1
//#endif
//
////形式2
//#ifndef kP
//
//#define kP 3
//
//#else
//
//#define kP 4
//
//#endif
//
////形式3
//#if 0
//
//#define kRong 0
//
//#else
//
//#define kRight 1
//
//#endif

//预编译指令
//以#开头的叫预编译指令:预编译时期做一些文本及代码的替换工作
//PI 代表宏名,3.14是预编译时期会被替换的内容
int main(int argc, const char * argv[]) {

//    //指针,指针变量
//    int a = 10;
//    int b = 6;
//    change(&a,&b);
//    //指针与函数
//    //练习:交换两个数的值
//    printf("a = %d,b = %d",a,b);
    /**
     *  

     int a[5] = {0};
     int count = sizeof(a) / sizeof(a[0]);

     getArray(a,count);
     */
   // char strArray[4][20] = {"iPhone", "iPad", "ipod", "iWatch"};

    //指针数组
    /**
     *  字符串
     char *strPinter[4] = {"iPhone", "iPad", "ipod", "iWatch"};
     printStr(strPinter,4);
     sortStrArray(strPinter,4);
     printStr(strPinter,4);
     */

    //指针数据类型:Student *
    //指针变量 :P
    //初值:&student,存储的是student的地址
    //指针变量 p 所占的字节: 8个字节
//
//    Student student = {"chihaitao",‘m‘,23,100};
//
//    Student *p = &student;

    //通过指针访问结构体成员
    /**
     *  *p 相当于student结构体变量
     */
//    printf("%s \n",student.name);
//
//    printf("%s \n",(*p).name);

    /**
     *  方式2
     CPoint c1 = {4,5};
     CPoint c2 = {7,1};

     CPoint *p1 = &c1;
     CPoint *p2 = &c2;

     printf("%f    ", qiujuli(p1,p2));
     // printf("%s \n",p->name);//通过指针,直接进行访问, ->指向操作符
     //使用->输出结构体变量student中的所有成员变量
     */
    /**
     *  <#Description#>
     Student student = {"chihaitao",‘m‘,23,100};
     Student stuArray[5] = {
     {"chichi",‘m‘,25,99},
     {"haihai",‘w‘,22,98},
     {"taotao",‘w‘,23,97},
     {"niuniu",‘w‘,22,98},
     {"bibi",‘w‘,23,97},
     };
     //->就是指针操作    (指针)->(结构体成员)
     Student *stu = stuArray;
     //字符串不能直接赋值,字符串指针能赋值
     (stu+4)->name = "fengfeng";
     (stu+1)->age = 120;
     printf("%s",(stu + 4)->name);
     printf("%d",(stu+1)->age);
     printf("%d",stuArray[4].age);
     //printf("%s",m1->name);
     printf("%f",stu[4].score);
     printf("%p",(stu + 4));
     printf("%p",&stuArray[4]);
     //按学生年龄升序排列
     for (int i = 0; i < 5 -1; i++) {
     for (int j = 0;j < 5 - 1 - i; j++) {
     if ((stu + j)->age > (stu+j + 1)->age) {
     Student temp = *(stu + j);
     *(stu + j) = *(stu + j + 1);
     *(stu + j + 1)=temp;
     }
     }
     }

     */

    //定义宏
    //普通宏
    //PI 代表宏名

    int mul = kMul(3 + 1, 5);
    printf("mul = %d\n",mul);

    /**
     * 宏与函数的区别
     1.宏是在预编译时期进行替换的内容,不进行任何的逻辑检测,只是简单的赋值而已,运行速度比函数快
     2.宏定义十不考虑参数的类型
     3.参数宏在定义时记得多加括号
     4.参数宏在使用时会再目标文件中村在多个副本,会增加目标文件的大小

     */
#ifdef PI   //如果定义了 PI
    printf("PI已经定义过了\n");
#else
    printf("PI没有定义\n");
#endif
#ifndef PI  //如果没有定义 PI
    printf("PI这个宏没有定义\n");
#else
    printf("早就定义过了\n");
#endif

#if 1  //和条件判断if else 用法一样
    printf("优衣库被查了");
#else
    printf("你说啥 听不懂\n");
#endif

    return 0;
}

//--------Function.h

//
//  Function.h
//  LessonPointerPro
//
//  Created by laouhn on 15/7/27.
//  Copyright (c) 2015年 池海涛. All rights reserved.
//

#import <Foundation/Foundation.h>

struct student{
    char *name;
    char sex;
    int age;
    float score;
};

typedef struct student Student;

typedef struct{
    char *name;
    char sex;
    int age;
    float score;
} Student1;

struct cpoint{
    float x;
    float y;
};
typedef struct cpoint CPoint;

void change(int *,int *);

void getArray(int *,int);

void print(int *,int);

void sortArray(int *,int);

void printStr(char *[],int);
void sortStrArray(char *[],int);

float qiujuli(CPoint *,CPoint *);

//Function.m

//
//  Function.m
//  LessonPointerPro
//
//  Created by laouhn on 15/7/27.
//  Copyright (c) 2015年 池海涛. All rights reserved.
//

#import "Function.h"

void change(int *a,int *b)
{
    int temp = *a;
     *a = *b;
    *b = temp;
}
void getArray(int *p,int count)
{

    for (int i = 0; i < count; i++) {
        *(p + i) = arc4random() % (100 - 10 + 1) + 10;
    }
    print(p,count);
    sortArray(p, count);
    print(p, count);
}
void print(int *a,int count)
{
    for (int i = 0; i < count; i++) {
        printf("%d ",*(a+i));
    }
    printf("\n");
}

void sortArray(int *a,int count)
{
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - i -1; j++) {
            if (*(a + j) > *(a + j + 1)) {
                int temp = *(a + j);
                *(a + j) = *(a + j +1);
                *(a + j + 1) = temp;
            }
        }
    }
}

void printStr(char *b[],int count)
{
    for (int i = 0; i < count; i++) {
        printf("%s ",*(b + i));
    }
}
void sortStrArray(char *str[],int count)
{
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (strcmp(str[j],str[j + 1] ) > 0) {
                char *temp = str[j];
                str[j] = str[j + 1];
                str[j + 1] = temp;
            }
        }
    }
}

float qiujuli(CPoint *a,CPoint *b){

    float x = fabsf(a->x - b->x);
    float y = fabsf(a->y - b->y);
    return sqrtf(x*x + y*y);
}
时间: 2024-10-12 17:27:00

ios指针第二天的相关文章

iOS 基础 第二天(0805)

0805 面向对象三大特性 封装.继承和多态 oc的方法都是在运行过程中才会检测的.编译时方法没实现只会出现警告,运行时出错.如果方法实现了但没有声明,运行时对象仍然可以调用方法不会出错.这是OC中弱语法的表现 说白了oc中的弱语法就是因为运行时检测合理性和可用性.编译时不会出错顶多是警告,运行时才警告.这个现象不仅仅体验在方法的声明和实现上,比较好的一个例子是MPMoviePlayerController的截屏通知事件,它需要传入float类型的数组,如果你在编译写了整型不会报错也不会警告,但

iOS 进阶 第二天(0324)

0324 创建transform transform 是形变属性. 如下图: 如果按照上面的方法来创建的话是这样解释:是相对初始状态来说的,不会在变化后的基础上进行形变.如果要持续变化就要自己去不断改变要变化的tx或者ty的值 如果要在当前的transform上直接进行不断改变就要按照下面的写法,如下图所示: 当然旋转也是一样,如下图: 当然缩放也是一样,如下图: plist 从本地程序包读取文件 懒加载数据 如下图: bundle 如下图: UIImageView的序列帧动画(每隔一段时间换一

IOS学习第二课 UIAlertView和UIActionSheet

1    UIAlertView 类似于Android中的Dialog,简单用法如下: UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Messate" delegate:nil cancelButtonTitle:@"Cancle" otherButtonTitles:nil, nil]; [alertView show]; 2   U

ios weibo 第二天 设置导航栏属性,添加加号按钮

要点:1.在底部添加加号按钮 2.设置导航栏属性 1.weibo底部的button其中四个按钮是一样的,其中中间的加号需要另外做处理 tablebar是自己定义的 ,代码如下 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // 删除系统自动生成的UITabBarButton for (UIView *child in self.tabBar.subviews) { if ([child isKin

C++二级指针第二种内存模型(二维数组)

C++二级指针第二种内存模型(二维数组) 二维数组 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”. 定义 类型说明符 数组名[常量表达式][常量表达式] 例如: float a[3][4],b[5][10]; 二维数组元素地址 #include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; int a[3][4]={ {1,2,3

C语言指针—————第二篇:指向另一指针的指针

本文转自 : http://c.biancheng.net/cpp/html/495.html  原文存在部分问题,现在已经修改,并重新发出来 一.回顾指针概念 早在本书第贰篇中我就对指针的实质进行了阐述.今天我们又要学习一个叫做“指向另一指针地址”的指针.让我们先回顾一下指针的概念吧!当我们程序如下声明变量:   short int i;   char a;   short int * pi;程序会在内存某地址空间上为各变量开辟空间,如下图所示: 图中所示中可看出:   i 变量在内存地址5的

C和指针第二章编程练习

1.编写一个程序,它由3个函数组成,每个函数分别保存在一个单独的源文件中.函数increment接受一个整形参数,它的返回值是该参数的值加1.increment函数应该位于文件increment.c中.第二个函数称为negate,它也接受一个整形参数,它的返回值是该参数的负值.最后一个函数是main,保存于文件main.c中,它分别用参数10,0,-10调用另外两个函数,并打印错误. int increment(int n) {     return n+1; } int negate(int 

学习制作iOS程序第二天:创建子目录、更改项目名称、修改启动画面、修改类前缀、新建启动控制器、修改APP图标

四.根据实际情况创建相应的目录 删除系统默认的部分文件ViewController.h,ViewController.m,Main.storyboard.LaunchScreen.xib 目录根据情况创建,每个人都会不一样的.我的如下. 五:更改项目名称 1.进入项目的Targets属性,找到Build Settings,搜索Product Name,修改属性为真实的软件名称. 2.打开Supporting Files目录下的Info.plist,修改Bundle name为真实的软件名称. 3

iOS 进阶 第二十二天(0603)

0603 block\运行时 block block的本质是一个指向结构体的指针. 运行时 要分析clang命令反编译出来的c++代码,就要把一些小括号删掉来分析.因为这些小括号一般都是类型强转. oc底层runtime是通过objec_msgSend这种消息派发机制给一个对象发送消息调用指定的方法的.如下图: 我用过运行时的东西来写代码,如下示例: 1.通过runtime底层代码的方式给一个对象的成员变量赋值,代码如下图: 2.分类扩充成员变量 本来分类是不能扩充成员变量的,但通过运行时的方法