直到昨天中午,我還在因?yàn)樽x錯(cuò)題而瘋狂學(xué)習(xí)新知識(shí)。
把整個(gè)任務(wù)腦補(bǔ)成了一個(gè)巨大的任務(wù)的錯(cuò)誤太可怕了座舍,以后要記住這次的教訓(xùn),簡(jiǎn)直是白費(fèi)了一天多的功夫陨帆。
不過這兩天也不僅僅做這個(gè)任務(wù)曲秉,還復(fù)習(xí)了計(jì)算機(jī)網(wǎng)絡(luò),但是考試居然不是今天疲牵,是下周的今天承二。
這種事情怎么老是搞錯(cuò)呢。纲爸。亥鸠。
算了都是好事不在意它。
結(jié)課作業(yè)中的問題
長(zhǎng)久不用C語言缩焦,導(dǎo)致語言基礎(chǔ)爆炸读虏,很多東西忘記怎么使用,頻頻報(bào)錯(cuò)袁滥。
寫兩篇日志盖桥,分別是C語言的語法方面的問題和C語言算法的問題,本篇是語法問題题翻。
指針和數(shù)組
這個(gè)問題一直是問題揩徊,在學(xué)C語言的時(shí)候草草就過去了,沒有細(xì)致探討嵌赠,這里進(jìn)行一定的實(shí)用性探討塑荒。
- 數(shù)組名是數(shù)組首元素地址
數(shù)組名和指針一樣,存儲(chǔ)的是地址姜挺,特殊在數(shù)組名內(nèi)存儲(chǔ)的是數(shù)組本身首元素的地址齿税。
一個(gè)詞叫做解引用,把一個(gè)地址對(duì)應(yīng)的數(shù)據(jù)取出就是解引用炊豪。
對(duì)于一個(gè)數(shù)組a[N]凌箕,我們進(jìn)行了三步:第一步,取出數(shù)組元素首地址词渤;第二步牵舱,目標(biāo)地址=首地址+sizeof(type)*N,得到目標(biāo)a[N]的地址缺虐;第三步芜壁,對(duì)地址解引用。
對(duì)于一個(gè)指針p高氮,只有兩步慧妄,對(duì)p的地址解引用,獲取到p的值纫溃,也就是p指向目標(biāo)的地址腰涧;再對(duì)這個(gè)目標(biāo)地址再次解引用,獲得目標(biāo)元素紊浩。
數(shù)組名窖铡!=數(shù)組指針,而是等于數(shù)組首元素指針坊谁。
- 一維數(shù)組可以和一維指針混用费彼,二維數(shù)組可以喝二維指針混用嗎?不可口芍!
首先我們強(qiáng)調(diào)箍铲,把多維數(shù)組當(dāng)做一維數(shù)組看待。
比如char arr[3][3],我們就要把它當(dāng)做一維數(shù)組鬓椭,內(nèi)里元素分別為arr[0]arr[1]arr[2],這三個(gè)char [3]型的數(shù)組颠猴。
為什么关划?
我們先來看二維數(shù)組名代表了什么在代碼中:
代碼1:
char buf[2][2]={{1,2},{3,4}};
char *p = buf;
編譯結(jié)果:
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
代碼2:
char buf[2][2]={{1,2},{3,4}};
char (*p)[2] = buf;
編譯結(jié)果:
無警告信息
顯然,二位數(shù)組的數(shù)組名指針類型是char*[2]型翘瓮,我們應(yīng)當(dāng)把二維乃至多維數(shù)組看成嵌套型的一維數(shù)組贮折,也就是俄羅斯套娃數(shù)組,我們可以看到资盅,數(shù)組名指針指向的首元素指針既可以是普通變量调榄,也可以是一維或多維數(shù)組。
- 那么如何用指針來指向數(shù)組呢呵扛?
數(shù)組中的元素排列是順序排列的每庆,也就是一橫排一橫排連續(xù),所以有以下代碼可以用指針指向數(shù)組并且調(diào)用今穿。
#include<stdio.h>
#include<stdlib.h>
#define ROW 2
#define COLUMN 2
int main(void)
{
char buf[ROW][COLUMN]={{1,2},{3,4}};
char *p = (char*)buf;
//訪問buf[x][y],即訪問p[x*COLUMN+y]
printf("buf = %d,%d,%d,%d\r\n",p[COLUMN*0+0],p[COLUMN*0+1],p[COLUMN*1+0],p[COLUMN*1+1]);
system("pause");
return 0;
}
結(jié)果是這樣
通過這個(gè)試驗(yàn)缤灵,我們可以了解到如何用指針來管理數(shù)組了。
指針傳遞蓝晒、引用傳遞
函數(shù)中有各種參數(shù)凤价,普通的直接調(diào)用沒有什么可說的,僅僅是新建一個(gè)值拔创,只存活在函數(shù)調(diào)用期間利诺,而函數(shù)麻煩而又有用的地方就在這指針傳遞和引用傳遞。
二者有什么共同點(diǎn)剩燥?
都是在函數(shù)中操作實(shí)參地址的慢逾,而值傳遞操作的不是實(shí)參地址。有什么不同點(diǎn)灭红?
引用的規(guī)則是被引用的同時(shí)必須被初始化侣滩,同時(shí)不能有NULL引用,引用必須與合法的存儲(chǔ)單元關(guān)聯(lián)变擒。
一旦引用倍初始化君珠,就不能改變引用的關(guān)系。
而指針可以任何時(shí)候被初始化娇斑,可以是NULL策添,可以隨時(shí)改變所指的對(duì)象。-
二者不同的根本原因毫缆。
從概念上講唯竹。指針從本質(zhì)上講就是存放變量地址的一個(gè)變量,在邏輯上是獨(dú)立的苦丁,它可以被改變浸颓,包括其所指向的地址的改變和其指向的地址中所存放的數(shù)據(jù)的改變。而引用是一個(gè)別名,它在邏輯上不是獨(dú)立的产上,它的存在具有依附性棵磷,所以引用必須在一開始就被初始化,而且其引用的對(duì)象在其整個(gè)生命周期中是不能被改變的(自始至終只能依附于同一個(gè)變量)晋涣。
用一段這個(gè)函數(shù)泽本,展示下使用流程。
#include<stdio.h>
#include<stdlib.h>
#define ROW 2
#define COLUMN 2
typedef struct TEST
{
int a;
int b[5];
int *c;
}testOf;
void tt(testOf *t);
void ttt(testOf &t);
int main(void)
{
testOf testa,testb;
testOf *te;
testOf *teb=&testb;
te=&testa;
testa.a=8;
for(int i=0;i<5;i++){
tt(te);
ttt(testa);
ttt(testb);
tt(teb);
}
teb=te;
printf("%d%d\n",testa.a,testa.c);
system("pause");
return 0;
}
void tt(testOf *t)
{
t->a++;
printf("%d\n",t->a);
t->c=&t->a;
}
void ttt(testOf &t)
{
t.a=100;
printf("%d\n",t.a);
}
函數(shù)多返回值
很多時(shí)候姻僧,我們都會(huì)碰到一個(gè)函數(shù)需要多個(gè)返回值,但是一個(gè)函數(shù)的返回值只有一個(gè)蒲牧,如何用一個(gè)函數(shù)返回多個(gè)值呢撇贺?
想到指針就對(duì)了,我們可以在參數(shù)中使用指針參數(shù)冰抢,傳遞我們主函數(shù)中的參數(shù)松嘶,通過這個(gè)函數(shù)來影響實(shí)參。
我很喜歡一句話就是“編程的本質(zhì)不就是改變量嗎挎扰?”先有量的輸入翠订,然后改變成很多量,變型遵倦、變數(shù)尽超、計(jì)算都是改變量。
輸入流
輸出的方法千篇一律梧躺,大多時(shí)候就是好看點(diǎn)和不好看的區(qū)別似谁。
每次寫c的時(shí)候,做題沒感覺掠哥,但是只要是寫整個(gè)程序就會(huì)出現(xiàn)各種難受的問題巩踏,最大的問題就是輸入的問題。
如何能夠方便輸入续搀、快速輸入經(jīng)常會(huì)成為一個(gè)大問題塞琼。
如何能夠快速輸入呢?
我們就想到一個(gè)方法禁舷,用空格隔開數(shù)組中的每一個(gè)數(shù)彪杉,用回車來確定。
這樣不僅能清晰看到我們的輸入牵咙,也比一直敲數(shù)字敲回車優(yōu)雅在讶。
粗略代碼如下
#include <stdio.h>
int main(){
int num;
int i=0;
int arr[10];
while(1){
scanf("%d",&num);
char c=getchar();
arr[i++]=num;
if(c=='\n'){
break;
}
}
return 0;
}
getchar();讀走了空格和回車并且在下面判定,空格再次循環(huán)霜大,回車退出构哺。
因?yàn)檫@次是為了給結(jié)課作業(yè)中的二維數(shù)組鄰接表做輸入,我就簡(jiǎn)單再寫一個(gè)給二維數(shù)組鄰接表賦值的詳細(xì)代碼。
#include<stdio.h>
#include<stdlib.h>
#define MAX_V_NUM 10
#define MAX_INT 999 //不可能數(shù)
//#define MAX_CITY_NUM 10
typedef struct TEST
{
char chengshi[20] ;
int arcsM[MAX_V_NUM][MAX_V_NUM];
int Vnum,Lnum;
int *c;
}testOf;
/*
typedef struct CITY
{
testOf city[MAX_CITY_NUM];
}TheWord
*/
void init(testOf *map);//初始化鄰接表曙强,每個(gè)點(diǎn)到其他店為不可能值残拐,到自己為0;
void mapIn(testOf &map);//手動(dòng)輸入鄰接表碟嘴,按行輸入溪食,空格分開數(shù),回車分開行娜扇。
void mapShow(testOf *map);//展示鄰接表
int main(void)
{
testOf map,arcs;
testOf *pmap;
testOf *parcs;
pmap=↦
parcs=&arcs;
init(pmap);
mapShow(pmap);
mapIn(map);
mapShow(pmap);
system("pause");
return 0;
}
/*初始化鄰接表错沃,*/
void init(testOf *map)
{
int i,j;
map->Vnum=MAX_V_NUM;
for(i=0;i<MAX_V_NUM;i++) //鄰接矩陣的初始化
{
for(j=0;j<MAX_V_NUM;j++)
{
if(i==j)
{
map->arcsM[i][j]=0;
}
else
{
map->arcsM[i][j]=MAX_INT;
}
}
}
}
/*手動(dòng)輸入鄰接表*/
void mapIn(testOf &map)
{
int num;
int i=0;
int j=0;
int Vtime;
printf("請(qǐng)輸入城市中重要站點(diǎn)的數(shù)目\n");
scanf("%d",&map.Vnum);
Vtime=map.Vnum;
getchar();
printf("請(qǐng)輸入鄰接表值,格式為1 2 3 4雀瓢,將這4個(gè)數(shù)賦值給鄰接矩陣第一排\n");
/*為鄰接表手動(dòng)賦值枢析,0代表不改變*/
for(i=0;i<map.Vnum;i++)
{
printf("現(xiàn)在是第%d行,共有%d行\(zhòng)n",i+1,map.Vnum);
for(j=0;j<map.Vnum;j++)
{
scanf("%d",&num);
char c=getchar();
if(num!=0 && map.arcsM[i][j]!=0)
{
map.arcsM[i][j]=num;
}
/*
if(c==' '){
Vtime--;
if(Vtime==1){
break;
}
}
*/
if(c=='\n'){
break;
}
}
}
}
/*展示鄰接表*/
void mapShow(testOf *map)
{
printf("--------此表如下----------\n");
int i,j;
for(i=0;i<map->Vnum;i++)
{
for(j=0;j<map->Vnum;j++)
{
printf("%d ",map->arcsM[i][j]);
}
printf("\n");
}
}
這段代碼實(shí)現(xiàn)了通過空格隔開數(shù)據(jù)刃麸,分行輸入數(shù)據(jù)到數(shù)組中醒叁,效果如下雖然沒有魯棒性,沒有錯(cuò)誤顯示泊业,不過有了一個(gè)大的架子把沼,試驗(yàn)中使用還是足夠的。
本次實(shí)驗(yàn)期間任務(wù)繁多吁伺,如果在最后較為空閑饮睬,會(huì)補(bǔ)出等同這段代碼,會(huì)更加美觀更加健壯篮奄。
以下是我遇到問題后续捂,上網(wǎng)查資料幫助到我的文章。
————————————————
版權(quán)聲明:本文為CSDN博主「千淘萬漉」的原創(chuàng)文章宦搬,遵循CC 4.0 BY-SA版權(quán)協(xié)議牙瓢,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/matrix_google/article/details/76595439
————————————————
版權(quán)聲明:本文為CSDN博主「魏波-」的原創(chuàng)文章间校,遵循CC 4.0 BY-SA版權(quán)協(xié)議矾克,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weibo1230123/article/details/75541862