當前位置:首頁 » 編程語言 » c語言指針和函數的問題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言指針和函數的問題

發布時間: 2022-04-16 23:40:11

c語言指針和函數題目

指針實際就是實體的代表而已,不過指針是個實體的存放地址;可以進行地址運算;
如:p++,指針指向下一地址;p=q以q指針指向地址作為p指針的地址;
普通的用法是,聲明實體或實體數組,用指針指向實體的地址:實體 b,g[8],*p;
p=&b;數組名稱實際就是固定長度的指針,所以常有:p=g;p=g+2相當於p=&g[2];
如函數 void fun(int b[]);可以用int *p;fun(p)來調用;p代表數組b;
如函數 void fun(int *p);可以用int b[6];fun(b)來調用;b相當於指針p;

⑵ c語言,函數里的指針問題

這個其實很好理解
只需要把%s,%c,%p放在一起看
首先%s是最常見的很好理解,就是告訴程序後面的變數是一個字元串,在C語言中也就是字元數組,類型是char*或者char[],換句話說,你告訴程序我會給你一個指針,你去讀這個指針指向的值。
然後%c是告訴程序後面的變數是個字元,類型是char,差別已經很明顯了,這時候你告訴程序我給你提供一個字元,你給我在%c處列印出來。然而你給的卻是一個指針,那程序就直接把你給的指針指向的地址本身當成字元列印出來了。但是一個地址肯定不止一個位元組,也就是說超過了char應該有的大小,這時候程序會直接忽略了超出大小的部分,只讀第一個位元組。
如果你同時使用%p,告訴程序,你會提供一個指針,直接把這個指針指向的地址給我列印出來。把輸出的地址最後兩位的16進制數查ascii表,換算成字元,你會發現,剛好就是前面%c列印出的字元。

⑶ c語言 指針 函數 問題

1.值傳遞
void swapl(int x, int y);
x和y的值等於a和b,但是他們在內存中地址和a b並不一樣,x和y是在函數swapl內重新申請的兩塊新內存空間。所以你這里交換的實際上是另兩處地址的值,而不是a b,從而不能達到交換的結果。

2.地址傳遞
void swap(int *p, int *q);
指針p q指向a b,操作他們就是操作a b兩塊內存了,所以能到到交換的結果。

希望對樓主有所幫助!答題不易,如果覺得可以,請採納,謝謝!

⑷ C語言指針調用函數問題,急求解釋(本題是《c和指針》上的題目)

我不清楚你的疑問到底指哪些。我就你寫的這些代碼解讀:
int read_column_numbers(int columns[], int max)函數功能:
傳參數組首地址,及數組最大長度。
用戶輸入max個整數,只保存其中的正整數(負數忽略),如果正整數的個數是偶數則返回個數。否則程序結束。
void rearrange(char *output,char const *input,int n_columns, int const columns[])函數功能:
傳參 數組output首地址 , 數組input首地址 ,用戶輸入正整數個數,正整數數組
迭代數組,根據用戶的輸入的數字作為input起始下標,復制並拼接到數組output中(具體邏輯我不研究了)。
strncpy(output + output_col,input + columns[col],nchars)這里就是就是拼接復制,變數output_col記錄的是output 已保存字元長度,output + output_col就是每次接在已有字元後面放復制的字元。input + columns[col]是用戶輸入的數字作為起始位置的偏移量取nchars個字元復制到output 中。
總結:
一、
首先數組名作為參數傳遞,無論形參定義是指針還是數組(int *columns 和 int columns[ ]效果是一樣的),最終都是傳地址。
二、
數組形參定義char const *,修飾符const表示常量不可修改,這里const修飾的是*input,表示數組指針指向的地址內容不能修改,但是數組指針本身值可以修改。也就是說函數中可以改變input指向的地址(比如input++),但是不能改變其指向的值(比如input[0]='A')。

⑸ C語言指針函數問題

#include<stdio.h>
char*test(void);
intmain(void)
{
char*ch;
ch=test();
puts(ch);
getchar();
return0;
}
//你的用法嚴格來講是錯誤的
char*test(void)
{
inti=0;
charch[20];//ch是程序分配在棧上的數組
while((ch[i++]=getchar())!=' ');
ch[i]='';
returnch;//函數結束之後ch就不再存在ch以前住的地方是一堆垃圾數據
}
//一般的用法把數組用作參數
voidtest(charch[])
{
inti=0;

//有限的輸入小心數組越界
while((ch[i++]=getchar())!=' ');
ch[i]='';
returnch;
}
//二般用法
char*test(void)
{
inti=0;
char*ch=0;

//可以分配堆上的內存給ch使用malloc函數在stdlib
ch=(char*)malloc(sizeof(char)*20);
while((ch[i++]=getchar())!=' ');
ch[i]='';
returnch;//返回堆上的指針函數結束後數據依然存在不過用完要free
}

⑹ C語言指針和函數的問題。!~~

這么給你解釋吧,指針就相當是一個門牌號。第一個呢,是因為f()函數的參數是指針,就是「門牌號」,所以他們交換的時候是把門牌號進行了交換。所以當你第二次進行訪問的時候,原來A房間變成了B房間,所以當你想要讓A房間里的人出來的時候,這個時候原來住在裡面的B君就出來了。所以發生了交換。
第二個呢,傳的是形參,形參就是把A君復制一個(我們理解為克隆一個A君),然後克隆一個B君,最後把克隆人交換。然後我們輸出的時候,我們卻要A房間里的人,那個時候,A君還在自己的房間,當然他們出來的時候,就是沒有交換了。如果,要交換,我們可以輸出克隆人。那麼看到的結果就是已經發生了交換。
我把第二個代碼,給你稍微改下,就是輸出克隆人,那麼你就會看到,我們原來交換的只是克隆人了。
============
第二個
#include
void main()
{void f(int x,int y);
int a,b;
scanf("%d,%d",&a,&b);
f(a,b);
}
void f(int x,int y)
{int p;
p=x;
x=y;
y=p;
printf("%d,%d",x,y);
}
輸入5,9
輸出9,5
===========

有不明白的繼續追問!

⑺ C語言中一個關於指針與函數的問題

這個原因很簡單.
因你的程序是單線程/單任務
且在你p=f1();後,沒有執行過其它任何程序
p指向的內存的值沒有被改變,所以結果是正確的
若你再定義一個函數,如
int
ttt()
{
int
x[10],i;
for(i=0;i<10;i++)
x[i]=i;
}
而你在
p=f1();
後面執行一下這個函數
...
p=f1();
ttt();
printf("%d\n",*p);
....
你看下結果
若程序是多線程多任務的
那情況就更復雜,你最終的*p值就不得而知了
所以C指針是有完全性問題的,程序的某些BUG就是這樣產生的

⑻ C語言函數和指針的問題

第一個正如你所說。
第二個的話是個函數的定義,這種返回函數指針的類型沒法直接寫在函數名的前面,所以
void (*GetOperateState(void))(U8)這一行是標明了返回值是個函數指針,返回的函數指針的結構跟第一個里的一樣,實際上也就是把第一個聲明的函數指針給返回了。
第三個跟第一個差不多,但是0不是指入口地址為0的函數,0代表NULL,是無的意思,這個是不能被調用的。

⑼ 關於C語言指針函數的問題

char*connect(char*dst,char*src)
{
char*q,*p;
for(p=dst;*p;p++);//將p指針移動到dst數組的結束符0的位置
for(q=src;*q;q++,p++)//dst從結束符開始,src從首地址開始,一一對應傳值
*p=*q;
*p=0;
returndst;
}

⑽ 關於C語言中指針函數的問題

不行, 原因是found函數已經聲明成返回一個int指針的函數了,如果不聲明p為指針則在p=founc(a,n)時會因為類型不匹配而報錯。兩種方法可以解決:1,直接省略掉變數p,在printf語句中直接用printf("%d", *found(a,n));來輸出結果;2,修改found函數為:<pre t="code" l="cpp">int found(int b[10], int n)
{
return b[n-1];
}則p可以直接聲明為int, 且賦值時用p=found(a,n); 輸出時用printf("%d", p);可以看到這樣改動的比較多。