大神們,這個程式是輸入學生序號,然后顯示該學生的四門成績,我所疑惑的地方是在search函式里,為什么要用p=*(score+n-1)?我知道p是為了取score+n-1的地址,但為什么要用*來取?*不是應該是用來表示該地址所指向的值么?求教大佬們!
#include<stdio.h>
float *search(float score[][4],int n);
int main()
{
float score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
printf("Please input you need to score of student's number:\n");
int n;
float *p;
scanf("%d",&n);
p=search(score,n);
printf("You need to number of %d student 's score:\n",n);
int i;
for(i=0;i<4;i++){
printf("%.2f\t",*(p+i));
//p++;
}
return 0;
}
float *search(float score[][4],int n){
float *p;
p=*(score+n-1);
return p;
}
uj5u.com熱心網友回復:
score是一個二維陣列。每個學生一行記錄共四個整形數,對應陣列編號1號學生score[0][0]-score[0][3],編號2號學生score[1][0]-score[1][3],編號3號學生score[2][0]-score[2][3],編號4號學生score[3][0]-score[3][3],。指標p可以取到第二維的每一個資料地址即第n個學生的第一個成績score[n-1][0],*(p+1)第二個成績score[n-1][1],*(p+2)第三個成績score[n-1][2],...uj5u.com熱心網友回復:
#include<stdio.h>float *search(float * score, int n);
int main()
{
float score[][4] = { { 60,70,80,90 },{ 56,89,67,88 },{ 34,78,90,66 } };
printf("Please input you need to score of student's number:\n");
int n;
float *p;
scanf("%d", &n);
p = search((float*)score, n);
printf("You need to number of %d student 's score:\n", n);
int i;
for (i = 0; i<4; i++) {
printf("%.2f\t", *(p + i));
//p++;
}
return 0;
}
float *search(float * score, int n) {
float *p;
p = (score + (n - 1)*sizeof(float));
return p;
}
這樣可能更容易理解一下指標,原來的關鍵在于編譯器如何解釋這個二唯陣列
uj5u.com熱心網友回復:
嗯?二維陣列?
認識這個嗎?對沒錯,這就是傳說中的套娃,
不過,用這個來比喻本例中的二重指標**不是很恰當,需要稍微改裝一下,
大聲唱:大套娃裝小套娃,一個小套娃呀,兩個小套娃,三個小套娃呀四個小娃,
小套娃里裝豆豆
,套娃是指標啊,豆豆是資料嗯嗯,唱完你就會了
假設這套娃只有3層,大套娃(最外層指標)里面并排裝了4個小套娃(里層指標),
至于這4個小套娃,里面裝多少粒豆子(資料 int,注意這里用豆子,而不是套娃了,再套下去套路就太深了),你隨意,在本例中是3,(3行4列)
這就是引數 (float score[][4]),表達的意思; score就是那個外層大套娃
指標操作這東西,*,每用一次*,你就可以理解為打開一層套娃,
而目前所學的,指標跟陣列的關系,就是那么一條
int arr[4];
int *p = arr;
*p; //也就是 *(p+0), p[0]
*(p+1); //p[1]
*(p+2); //p[2]
*(p+3); //p[3];
好了, 來看代碼
float *search(float score[][4],int n){
float *p;
p=*(score+n-1);
/*
*(score + 0);
score 是什么?大套娃,*呢? 打開它(一次);
打開一次之后你看到豆子了嗎?--沒有,你看到了4個小套娃
*(score+0)呢,4個中的第一個“套娃”
*(score+1)呢? 第二個“套娃”
........
*(score+3)呢, 第四個“套娃”
好了,p是什么?豆豆? 不是的,不是豆豆,是套娃,回想前面的歌謠,,套娃是什么,套娃是指標
從函式回傳,丟個小套娃出去,想訪問資料(豆豆), 再開一次套娃,怎么開 用*, *(p+0) *(p+1).......
*/
return p;
}最后,正經點的,來折磨你一下,其實編譯器是怎么翻譯這個函式的呢
//先來個簡單的,熱身一下
float *search(float score[4], int n);
//實際上轉為====>
float *search(float *score, int n);
//然后這個呢
float *search(float score[][4],int n)
//實際上在編譯器里,他是這樣的東西==》
float *search(float (*score)[4], int n);
你看懂了嗎?如果不懂,,還是想想套娃吧。
uj5u.com熱心網友回復:
二維陣列前面加一個星號就代表列了,p=*(score+n-1)代表p指向a[n-1][0]的地址, *(score+1)+2就代表a[1][2]uj5u.com熱心網友回復:
score[][]是一個二維陣列 里邊的里邊的第一個元素的值(60)可以用**score 表示。最后一個是*(*(score+2)+3).*(score+1)是陣列score[1][0]的地址 ,其后地址為score[1][0] score[1][1] score[1][2] score[1][3];后邊還有
score[2][0] score[2][1]等等 題目中p是一個地址 *(score+n-1)也是一個地址
我感覺你主要還是沒有搞懂二維陣列的指標表示。反正你知道二維陣列中一個 * 是地址
兩個* 是數值就好了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/101663.html
標籤:C語言
上一篇:程式判斷是否為整數
