⑴ 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]='