【IOS 开发学习总结-OC-7.11-★】 objective-c——指针数组和指向指针的指针

来源:互联网 发布:python遍历中文字符串 编辑:程序博客网 时间:2024/05/21 17:04

指针数组与 main() 函数形参

有时需要一次声明具有多个相同特征的指针变量,此时可借助,指针数组来实现。指针数组使用最多的地方是处理字符串数组的情况,由于字符串本身需要使用 char * 型指针变量来表示,当程序中有多个字符串要保存时,就可以借助指针数组。

声明指针数组与声明普通数组的语法类型:语法格式:类型* 数组变量[长度]; 注意与类型 (*变量名)[长度];的语法格式相区分。
区别在于:
第一种写法,中[]运算符的优先级比*要高,数组变量先于后面的[]结合成数组形式,前面的"类型*" 则用于指定多个数组元素类型,且声明每个数组元素都是指针。
第二种写法,(*变量名)先形成一个整体,代表一个指针变量,该指针变量指向一维数组。表示定义一个指向一维数组的指针变量。
示例程序:(对多个字符串进行排序,按从小到大的顺序进行排列)

#import <Foundation/Foundation.h>void sort(char* names[] , int n){    char* tmp;    // 外轮循环控制依次取得0~n-2个字符串    for(int i = 0 ; i < n - 1 ; i++)    {        // 用第i个字符串,依次与后面的每个字符串相比        for(int j = i + 1 ; j < n ; j++)        {            // 如果names[i]的字符串大于names[j]的字符串, 交换它们            // 这样就可以保证第i个位置的字符串总比后面的所有字符串小            if(strcmp(names[i] , names[j]) > 1)            {                 tmp = names[i];                 names[i] = names[j];                 names[j] = tmp;            }        }    }}int main(int argc , char * argv[]){    @autoreleasepool{        int nums = 5;        // 定义5个字符串        char* strs[] = {"Objective-C" , "iOS" , "Java"            , "Ajax" , "Android"};        // 对字符串排序        sort(strs , nums);        // 输出字符串        for(int i = 0 ; i < nums ; i ++)        {            NSLog(@"%s" , strs[i]);        }    }}

我们来看排序前和排序后的,存储示意图:
这里写图片描述

指向指针的指针

指针变量也是变量,也需要保存在内存中,指针变量也有自己的内存地址。如果再定义一个指针变量来保存指针变量的存储地址,该地址就是指向指针的指针。
声明指向指针变量的指针语法格式是:
类型** 变量名;`
如下程序:

#import <Foundation/Foundation.h>int main(int argc , char * argv[]){    @autoreleasepool{        int a = 20;        int* p = &a;        int** pt = &p;        // 输出指针变量p保存的地址:a变量的地址        NSLog(@"%p" , p);        // 输出指针变量pt保存的地址:指针变量p的地址        NSLog(@"%p" , pt);        // 输出指针变量pt所指变量p(依然是指针)中保存的地址(变量 a 的地址)        NSLog(@"%p" , *pt);        // 输出pt所指的指针变量指向的变量的值        NSLog(@"%d" , **pt);            }}

编译,输出的结果:

0x7fff5fbff84c0x7fff5fbff8400x7fff5fbff84c20

对于 objective-c 编程而言,更多的是采用面向对象的方式进行。因此对于指向指针的指针这种用法了解即可,无需深入。

0 0