本文目录一览:
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");
}