您的位置:

c语言指向数组的指针,c语言指向数组的指针是什么

本文目录一览:

C语言如何定义指针指向字符型二维数组

使用指针变量访问二维数组的任意一个元素的方法:

1.使用列指针:定义一个列指针p,让它指向二维数组的第0个元素

int a[3][4];

int *p;

p=a[0][0]; 

//因为a[0]是第0行的数组名,所以p=a[0][0]相当于p=a[0],因为a[i][j]前面共有i*4+j个元素

该二维数组的任意i行j列元素可表示为*(p+i*4+j)。

2.使用行指针:定义一个行指针p,让它指向二维数组的第0行

int a[3][4];

int (*p)[4];

p=a;   //也可以为p=a[0]; 

其中* ( *(p+i)+j)表示任意一个i行j列的元素。

扩展资料:

数组的使用规则:

1.可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。例如:static int a[10]={0,1,2,3,4};表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。

2.只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能写为:static int a[10]=1;请注意:在C、C#语言中是这样,但并非在所有涉及数组的地方都这样,数据库是从1开始。

3.如不给可初始化的数组赋初值,则全部元素均为0值。

4.如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。例如:static int a[5]={1,2,3,4,5};可写为:static int a[]={1,2,3,4,5};动态赋值可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。

参考资料:

百度百科-数组

有关C语言指向指针的指针

我就用自己的理解给你讲一下吧

指针其实就是指向一个变量的变量,具体的说,一个指针它里面保存的是一个变量的地址,而一般的变量保存的是数据,所以指针它的本质也是变量.

指向指针的指针就是一个指针它指向另外一个指针变量,它保存的是另外一个指针的地址,指向指针的指针其实和一般的指针没什么两样,只是它保存的是另一个指针,一般的指针保存的是地址,指向指针的指针访问数据时是间接访问,是通过它保存的指针来进行访问,比一般的指针多了一个中间量,它可以进行**P的运算,而一般的指针的运算为*p,

不知道我的表达能力如何???

如有不懂,请给我发消息

C语言编程指向结构体数组的指针

下面的程序是我以前写的,你稍微改改就能符合你的要求了

#include stdio.h

#include malloc.h

typedef struct st

{

    char name[20];

    int chinese;

    int math;

    int english;

    float average;

}student;

void swap(student *a, student *b)

{

    student temp = *a;

    *a = *b;

    *b = temp;

}

void sort(student *array, int n)

{

    int i, j, flag;

    for (i = 0; i  n - 1; i++)

    {

        flag = 1;

        for (j = 0; j  n - i - 1; j++)

        {

            if (array[j].average  array[j + 1].average)

            {

                swap(array + j, array + j + 1);

                flag = 0;

            }

        }

        if (flag)

            break;

    }

}

void print(student *array, int n)

{

    int i;

    printf("姓名\t语文\t数学\t英语\t平均成绩\n");

    for (i = 0; i  n; i++)

    {

        printf("%s\t%d\t%d\t%d\t%f\n", array[i].name, array[i].chinese,

            array[i].math, array[i].english, array[i].average);

    }

}

int main()

{

    int number = 9;

    int i;

    student *stu = (student *)malloc(sizeof(student) * 9);

    for (i = 0; i  number; i++)

    {

        printf("请输入第%d个学生的姓名及成绩(姓名 语文 数学 英语成绩以空格隔开):\n", i + 1);

        scanf("%s %d %d %d", (*(stu + i)).name, (*(stu + i)).chinese, 

            (*(stu + i)).math, (*(stu + i)).english);

        (*(stu + i)).average = ((*(stu + i)).chinese + 

            (*(stu + i)).math + (*(stu + i)).english) / (float)3.0;

    }

    print(stu, number);

    sort(stu, number);

    print(stu, number);

    free(stu);

    return 0;

}

C语言 指向二维数组的指针

a是指针,不过是行指针,p的基类型int,而 a 的基类型是一个包含4个整形元素的一类数组.

int (*p)[4] = a;这样定义p也会编译过去的,因为这时p的基类型也是一个包含4个整形元素的一类数组。

至于int* p = a[0];编译正确,是因为a[0]也是指针,基类型也是int。

C语言中 数组指针的意义

你说的是指向数组的指针如int(*)[]?

指向数组的指针有一种非常常见的用法,就是令其指向二维数组的某一行。如二维数组a[3][4],它的本质是一维数组的数组,即a本质上是一个3个元素的数组,其中的每个元素都是一个int[4]数组。要想使用一个指针p指向其中的某个元素,就必须将p定义为数组指针int (*p)[4],它指向一个int[4]数组。然后,才可以令p指向a:p=a。

C语言指向二维数组的指针

一、你的 float score 数组定义的是:一个3行、4列的二维浮点数组,数组的元素为浮点数。如果你换个格式书写就清晰了!

float score[3][4]={{65,67,70,60,},{80,87,90,81,},{90,99,100,98}};

在调用的过程中,score 就是这个数组的首地址,指向的是浮点数组{65,67,70,60,}。score + 1 指向的是数组{80,87,90,81,}。

二、你的 float *p 定义的是:一个指向浮点数的指针。这个是一维的。

在调用的过程中,float 指向的是 xx。一个浮点数字。

两个的定义不同,所以参数传递过程中会出错。

三、你的 float (*p)[4] 定义的是:一个指向含有四个元素的浮点数组的指针。

在调用的过程中,float 指向的是{xxx,xx,xx,xx,},由四个浮点数组成的数组。

这时两个定义相同,所以参数传递过程中没有错误。

四、有个建议,你的程序书写格式不清晰,不利于你纠错和修改,应该尽量的清晰、明确,不建议使用简化方式定义参数。

作为一个软件工作者,应该尽量使程序流畅、格式清晰、易读,这是一个软件工作者最基本的职业素养。

格式化后,程序如下,会清晰很多:

#includestdio.h

void main()

{

void search (float (*p)[4],int n);/*这里的 float *p 好像有问题*/

float score[3][4]={{65,67,70,60,},{80,87,90,81,},{90,99,100,98}};

search(score,2);

}

void search(float (*p)[4],int n)/*这里的 float *p 好像有问题*/

{

int i;

printf("the score of No.%d are:\n",n);

for(i=0;i4;i++)

{

printf("%5.2f",*(*(p+n)+i));

}

printf("\n");

}