学习记录第十五天

数组指针:

1 数组指针的定义

我们可以定义一个指向数组的指针,例如:

int a[] = {1,2,3,4,5};
int *p = a;

a本身就是一个指针,可以直接赋值给指针变量 p。a是数组第 0 个元素的地址,所以int *p = a;也可以写作int *p = &a[0];。也就是说,a、p、&a[0] 这三种写法都是等价的,它们都指向数组第 0 个元素,或者说指向数组的开头。

学习记录第十五天_第1张图片
再强调一遍,“a本身就是一个指针”这种表述并不准确,严格来说应该是“a 被转换成了一个指针”。

如果一个指针指向了数组,我们就称它为数组指针(Array Pointer)

对指针变量进行加法和减法运算时,是根据数据类型的长度来计算的。如果一个指针变量 p 指向了数组的开头,那么 p+i 就指向数组的第 i 个元素;如果 p 指向了数组的第 n 个元素,那么 p+i 就是指向第 n+i 个元素;而不管 p 指向了数组的第几个元素,p+1 总是指向下一个元素,p-1 也总是指向上一个元素。

printf("%p\n",p);
printf("%p\n",p + 1);//两者相差sizeof(int)个字节;

二维数组的遍历:

void printArray2D(int (*a)[4],int rows)
{
    int i,j;
    for(i =0;i < rows;++i)
    
    {
        for(j = 0;j < 4;++j)
        {
            printf("%2d ",*(*(a + i) + j));//a[i][j]  ---*(*(a + i) + j)
        }
        puts("");
    }
}

 函数指针:

为了降低函数的耦合性;函数的函数名就是函数的入口地址;

指针函数: 顾名思义,它的本质是一个函数,不过它的返回值是一个指针。其声明的形式如下所示:

ret *func(args, ...);

 按要求输出所需元素,本代码为输出能被3整除的数;

int div2(int n)
{
    return n % 2 ==0;
}

int div3(int n)
{
    return n % 3 ==0;
}

void printArray(int *a, int rows,int (*pfn)(int))
{
    int i;
    for(i = 0;i < rows;++i)
    {
        if(pfn(a[i]))
        {
            printf("%d\n",a[i]);
        }
    }
}

int main(void)
{
    int a[]= {1,2,3,4,5,6,7,8,9,10,11,12};
    int len = sizeof(a) / sizeof(a[0]);
    printArray(a,len,div3);
    return 0;
}

指向指针的指针:

指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。

一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int 类型指针的指针:

int **var;

遍历

void printString(char **s,int len)
{
    int i;
    for(i = 0;i < len;++i)
    {
        puts(s[i]);
    }
}

指针数组:

指针数组,即数组中的每个元素都是一个指针。这些指针可以指向任何类型的数据。指针数组通常用于存储一组数据的地址,或传递一组数据的地址给函数。

指针数组的声明和初始化
下面是指针数组的声明方法:

type *arrayName[size];
其中 type 表示指针指向的数据类型,arrayName 是指针数组的名字,size 表示指针数组的大小。

接下来是指针数组的初始化:

type *arrayName[size] = {pointer1, pointer2, pointer3, ... };
其中 pointer1, pointer2, pointer3 等表示指针数组中每个元素指向的地址。注意,指针数组也可以不进行初始化。

选择排序;

void sortString(char **s,int len)
{
    int i,j;
    for(i = 0;i < len - 1;++i)
    {
        for(j = i + 1;j < len ;++j)
        {
            if(strcmp(s[i], s[j]) > 0)
            {
                swap(s + i,s+ j);
            }
        }
    }
}

快速排序

int doublecmp(const void *p1,const void *p2)
{
    double *q1 = (double *)p1;
    double *q2 = (double *)p2;
    if(*q1 > *q2)
    {
        return 1;
    }
    else if(*q1 > *q2)
    {
        return -1;
    }
    else
    {
        return 0;
    }
}

你可能感兴趣的:(算法,数据结构)