當前位置:首頁 » 編程語言 » c語言指針編程

c語言指針編程

發布時間: 2022-07-13 01:52:05

A. c語言指針編程題,求助大佬

#include <stdio.h>

int main()

{

int a;

int b;

int *pa = &a;

int *pb = &b;

printf("請輸入a和b的值: ");

scanf("%d %d", pa, pb); //在高版本的vs里要用scanf_s

printf("a和b的和是: %d\n", *pa + *pb);

printf("a和b的差是: %d\n", *pa - *pb);

printf("a和b的積是: %d\n", *pa * *pb);

printf("a和b的商是: %f\n", *pa * 1.0 / *pb);

return 0;

}

B. C語言 數組和指針編程題

// ConsoleApplication3.cpp : 定義控制台應用程序的入口點。

#include "stdafx.h"
void upCopy(char* new1, char* old)
{
while (*old)
{
if (65<=*old && *old<= 90) *new1++=*old;
old++;
}
*new1=0;
}

int main()
{
char s1[140]; //="";
char s0[]="foiwABEifjCDB";
upCopy(s1, s0);
printf("(%s%s",s1,")");
getchar();
return 0;
}

C. C語言指針編程題,求大神解答

#include "stdio.h"

void fun(int a[][6],int n,int m,int *odd,int *even)

{int i,j;

*odd=*even=0;

for(i=0; i<n; i++)

for(j=0; j<m; j++)

a[i][j]%2?*odd+=a[i][j]:*even+=a[i][j];

}

int main()

{ int n,m,i,j,a[5][6],odd,even;

for(i=0; i<5; i++)

{ for(j=0; j<6; j++)

{ a[i][j]=i*6+j+1;

printf("%4d",a[i][j]);

}

printf(" ");

}

fun(a,5,6,&odd,&even);

printf("奇數之和=%d 偶數之和=%d ",odd,even);

return 0;

}

D. c語言指針簡單教程

指針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變數可以表示各種數據結構; 能很方便地使用數組和字元串; 並能象匯編語言一樣處理內存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。 學習指針是學習C語言中最重要的一環, 能否正確理解和使用指針是我們是否掌握C語言的一個標志。同時, 指針也是C語言中最為困難的一部分,在學習中除了要正確理解基本概念,還必須要多編程,上機調試。只要作到這些,指針也是不難掌握的。

指針的基本概念 在計算機中,所有的數據都是存放在存儲器中的。 一般把存儲器中的一個位元組稱為一個內存單元, 不同的數據類型所佔用的內存單元數不等,如整型量佔2個單元,字元量佔1個單元等, 在第二章中已有詳細的介紹。為了正確地訪問這些內存單元, 必須為每個內存單元編上號。 根據一個內存單元的編號即可准確地找到該內存單元。內存單元的編號也叫做地址。 既然根據內存單元的編號或地址就可以找到所需的內存單元,所以通常也把這個地址稱為指針。 內存單元的指針和內存單元的內容是兩個不同的概念。 可以用一個通俗的例子來說明它們之間的關系。我們到銀行去存取款時, 銀行工作人員將根據我們的帳號去找我們的存款單, 找到之後在存單上寫入存款、取款的金額。在這里,帳號就是存單的指針, 存款數是存單的內容。對於一個內存單元來說,單元的地址即為指針, 其中存放的數據才是該單元的內容。在C語言中, 允許用一個變數來存放指針,這種變數稱為指針變數。因此, 一個指針變數的值就是某個內存單元的地址或稱為某內存單元的指針。圖中,設有字元變數C,其內容為「K」(ASCII碼為十進制數 75),C佔用了011A號單元(地址用十六進數表示)。設有指針變數P,內容為011A, 這種情況我們稱為P指向變數C,或說P是指向變數C的指針。 嚴格地說,一個指針是一個地址, 是一個常量。而一個指針變數卻可以被賦予不同的指針值,是變。 但在常把指針變數簡稱為指針。為了避免混淆,我們中約定:「指針」是指地址, 是常量,「指針變數」是指取值為地址的變數。 定義指針的目的是為了通過指針去訪問內存單元。

既然指針變數的值是一個地址, 那麼這個地址不僅可以是變數的地址, 也可以是其它數據結構的地址。在一個指針變數中存放一
個數組或一個函數的首地址有何意義呢? 因為數組或函數都是連續存放的。通過訪問指針變數取得了數組或函數的首地址, 也就找到了該數組或函數。這樣一來, 凡是出現數組,函數的地方都可以用一個指針變數來表示, 只要該指針變數中賦予數組或函數的首地址即可。這樣做, 將會使程序的概念十分清楚,程序本身也精練,高效。在C語言中, 一種數據類型或數據結構往往都佔有一組連續的內存單元。 用「地址」這個概念並不能很好地描述一種數據類型或數據結構, 而「指針」雖然實際上也是一個地址,但它卻是一個數據結構的首地址, 它是「指向」一個數據結構的,因而概念更為清楚,表示更為明確。 這也是引入「指針」概念的一個重要原因。

指針變數的類型說明

對指針變數的類型說明包括三個內容:
(1)指針類型說明,即定義變數為一個指針變數;
(2)指針變數名;
(3)變數值(指針)所指向的變數的數據類型。
其一般形式為: 類型說明符 *變數名;
其中,*表示這是一個指針變數,變數名即為定義的指針變數名,類型說明符表示本指針變數所指向的變數的數據類型。
例如: int *p1;表示p1是一個指針變數,它的值是某個整型變數的地址。 或者說p1指向一個整型變數。至於p1究竟指向哪一個整型變數, 應由向p1賦予的地址來決定。
再如:
staic int *p2; /*p2是指向靜態整型變數的指針變數*/
float *p3; /*p3是指向浮點變數的指針變數*/
char *p4; /*p4是指向字元變數的指針變數*/ 應該注意的是,一個指針變數只能指向同類型的變數,如P3 只能指向浮點變數,不能時而指向一個浮點變數, 時而又指向一個字元變數。

指針變數的賦值

指針變數同普通變數一樣,使用之前不僅要定義說明, 而且必須賦予具體的值。未經賦值的指針變數不能使用, 否則將造成系統混亂,甚至死機。指針變數的賦值只能賦予地址, 決不能賦予任何其它數據,否則將引起錯誤。在C語言中, 變數的地址是由編譯系統分配的,對用戶完全透明,用戶不知道變數的具體地址。 C語言中提供了地址運算符&來表示變數的地址。其一般形式為: & 變數名; 如&a變示變數a的地址,&b表示變數b的地址。 變數本身必須預先說明。設有指向整型變數的指針變數p,如要把整型變數a 的地址賦予p可以有以下兩種方式:
(1)指針變數初始化的方法 int a;
int *p=&a;
(2)賦值語句的方法 int a;
int *p;
p=&a;
不允許把一個數賦予指針變數,故下面的賦值是錯誤的: int *p;p=1000; 被賦值的指針變數前不能再加「*」說明符,如寫為*p=&a 也是錯誤的

指針變數的運算

指針變數可以進行某些運算,但其運算的種類是有限的。 它只能進行賦值運算和部分算術運算及關系運算。
1.指針運算符

(1)取地址運算符&
取地址運算符&是單目運算符,其結合性為自右至左,其功能是取變數的地址。在scanf函數及前面介紹指針變數賦值中,我們已經了解並使用了&運算符。

(2)取內容運算符*
取內容運算符*是單目運算符,其結合性為自右至左,用來表示指針變數所指的變數。在*運算符之後跟的變數必須是指針變數。需要注意的是指針運算符*和指針變數說明中的指針說明符* 不是一回事。在指針變數說明中,「*」是類型說明符,表示其後的變數是指針類型。而表達式中出現的「*」則是一個運算符用以表示指針變數所指的變數。
main(){
int a=5,*p=&a;
printf ("%d",*p);
}
......
表示指針變數p取得了整型變數a的地址。本語句表示輸出變數a的值。
2.指針變數的運算

(1)賦值運算

指針變數的賦值運算有以下幾種形式:
①指針變數初始化賦值,前面已作介紹。

②把一個變數的地址賦予指向相同數據類型的指針變數。例如:
int a,*pa;
pa=&a; /*把整型變數a的地址賦予整型指針變數pa*/

③把一個指針變數的值賦予指向相同類型變數的另一個指針變數。如:
int a,*pa=&a,*pb;
pb=pa; /*把a的地址賦予指針變數pb*/
由於pa,pb均為指向整型變數的指針變數,因此可以相互賦值。

④把數組的首地址賦予指向數組的指針變數。
例如: int a[5],*pa;
pa=a; (數組名表示數組的首地址,故可賦予指向數組的指針變數pa)
也可寫為:
pa=&a[0]; /*數組第一個元素的地址也是整個數組的首地址,
也可賦予pa*/
當然也可採取初始化賦值的方法:
int a[5],*pa=a;

⑤把字元串的首地址賦予指向字元類型的指針變數。例如: char *pc;pc="c language";或用初始化賦值的方法寫為: char *pc="C Language"; 這里應說明的是並不是把整個字元串裝入指針變數, 而是把存放該字元串的字元數組的首地址裝入指針變數。 在後面還將詳細介紹。

⑥把函數的入口地址賦予指向函數的指針變數。例如: int (*pf)();pf=f; /*f為函數名*/

(2)加減算術運算

對於指向數組的指針變數,可以加上或減去一個整數n。設pa是指向數組a的指針變數,則pa+n,pa-n,pa++,++pa,pa--,--pa 運算都是合法的。指針變數加或減一個整數n的意義是把指針指向的當前位置(指向某數組元素)向前或向後移動n個位置。應該注意,數組指針變數向前或向後移動一個位置和地址加1或減1 在概念上是不同的。因為數組可以有不同的類型, 各種類型的數組元素所佔的位元組長度是不同的。如指針變數加1,即向後移動1 個位置表示指針變數指向下一個數據元素的首地址。而不是在原地址基礎上加1。
例如:
int a[5],*pa;
pa=a; /*pa指向數組a,也是指向a[0]*/
pa=pa+2; /*pa指向a[2],即pa的值為&pa[2]*/ 指針變數的加減運算只能對數組指針變數進行, 對指向其它類型變數的指針變數作加減運算是毫無意義的。(3)兩個指針變數之間的運算只有指向同一數組的兩個指針變數之間才能進行運算, 否則運算毫無意義。

①兩指針變數相減
兩指針變數相減所得之差是兩個指針所指數組元素之間相差的元素個數。實際上是兩個指針值(地址) 相減之差再除以該數組元素的長度(位元組數)。例如pf1和pf2 是指向同一浮點數組的兩個指針變數,設pf1的值為2010H,pf2的值為2000H,而浮點數組每個元素佔4個位元組,所以pf1-pf2的結果為(2000H-2010H)/4=4,表示pf1和 pf2之間相差4個元素。兩個指針變數不能進行加法運算。 例如, pf1+pf2是什麼意思呢?毫無實際意義。

②兩指針變數進行關系運算
指向同一數組的兩指針變數進行關系運算可表示它們所指數組元素之間的關系。例如:
pf1==pf2表示pf1和pf2指向同一數組元素
pf1>pf2表示pf1處於高地址位置
pf1<pf2表示pf2處於低地址位置
main(){
int a=10,b=20,s,t,*pa,*pb;
pa=&a;
pb=&b;
s=*pa+*pb;
t=*pa**pb;
printf("a=%d\nb=%d\na+b=%d\na*b=%d\n",a,b,a+b,a*b);
printf("s=%d\nt=%d\n",s,t);
}
......
說明pa,pb為整型指針變數
給指針變數pa賦值,pa指向變數a。
給指針變數pb賦值,pb指向變數b。
本行的意義是求a+b之和,(*pa就是a,*pb就是b)。
本行是求a*b之積。
輸出結果。
輸出結果。
......
指針變數還可以與0比較。設p為指針變數,則p==0表明p是空指針,它不指向任何變數;p!=0表示p不是空指針。空指針是由對指針變數賦予0值而得到的。例如: #define NULL 0int *p=NULL; 對指針變數賦0值和不賦值是不同的。指針變數未賦值時,可以是任意值,是不能使用的。否則將造成意外錯誤。而指針變數賦0值後,則可以使用,只是它不指向具體的變數而已。
main(){
int a,b,c,*pmax,*pmin;
printf("input three numbers:\n");
scanf("%d%d%d",&a,&b,&c);
if(a>b){
pmax=&a;
pmin=&b;}
else{
pmax=&b;
pmin=&a;}
if(c>*pmax) pmax=&c;
if(c<*pmin) pmin=&c;
printf("max=%d\nmin=%d\n",*pmax,*pmin);
}
......
pmax,pmin為整型指針變數。
輸入提示。
輸入三個數字。
如果第一個數字大於第二個數字...
指針變數賦值
指針變數賦值

指針變數賦值
指針變數賦值
判斷並賦值
判斷並賦值
輸出結果
......

E. c語言指針的編程題

#include<stdio.h>
void
main()
{
char
str1[10],str2[10],*p;
int
i;
p=str1;
for(i=0;i<9;i++)
scanf("%c",&str1[i]);
str1[i]=
'\0';////該在str1[i]最後加一個'\0'要下面的結束for(i=0;*p;i++,p++)
就找不到結束符,所以後面就有亂碼「燙燙」
for(i=0;*p;i++,p++)///你可以用i<10來直接截取字元的前十位是可以的但是只是截取,其實真是的str2仍然後面有亂碼
str2[i]=*p;
str2[i]='\0';
printf("%s\n",str2);
}

F. C語言用指針編寫程序

#include<stdio.h>
#defineN5
#defineM5
voidf(inta[][M],intn,intm,int*s){inti,j;
for(i=0;i<n;i++,s++){
*s=a[i][0];for(j=1;j<m;j++)if(*s<a[i][j])*s=a[i][j];
}
}
voidmain(){inta[N][M],s[N],i,j;
for(i=0;i<N;i++)for(j=0;j<M;j++)scanf("%d",&a[i][j]);
f(a,N,M,s);
for(i=0;i<N;i++)printf("%d ",s[i]);
}

G. C語言指針編程

代碼文本:

#include "stdio.h"

#define N 10

#define F(x) ((x)>0 ? (x) : -(x))

int f(int *p){

int i,mini;

for(mini=0,i=1;i<N;i++)

if(F(p[mini]) > F(p[i]))

mini=i;

printf("%d ",p[mini]);

return mini;

}

int main(int argc,char *argv[]){

int a[N],i;

printf("Enter the %d integers... ",N);

for(i=0;i<N;scanf("%d",a+i++));

printf("The subscript is %d ",f(a));

return 0;

}

H. C語言指針編程

#include<stdio.h>
intmax(inta,intb)
{
returna>b?a:b;
}
intmin(inta,intb)
{
returna<b?a:b;
}
intmain()
{
inta,b,i;
int(*p[2])(int,int)={max,min};
scanf("%d%d",&a,&b);
scanf("%d",&i);
if(i==1||i==2)
printf("%d ",p[i-1](a,b));
return0;
}

I. 用c語言指針編程

有點麻煩,試試~~

最近考試有點忙,~
還未通過編譯,你自己看著改改,我會盡快再發給你的。~~
1、首先格式化輸入到棧,形式為:(字母開始,字母結束,空格分開不同單詞,空格不能連續)。
2、構建子棧,步驟:由母棧經格式化(取每個單詞後半部到子棧)。
3、排序。
4、輸出。

子棧元素首行格式為(堆棧元素 + 指向一數據結構的指針)

#include<ctype.h>
#include<stdio.h>
#define STACK_INT_SIZE 100 //存儲空間初始分配量
#define STACKINCREMENT 10 //存儲空間分配增量
#define OK 0
typedef struct C_Node{
char elem;
struct C_Node *next;
}C_Node;
typedef struct C_Stack{
char C_elem;
char *base;
char *top;
C_Node *C_next;
}C_Stack;
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
Status InitStack (SqStack &S)
{ S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if (!S.base) exit (OVERFLOW); //存儲分配失敗
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status Push (SqStack &S, char e) {
if (S.top - S.base >= S.stacksize) {//棧滿,追加存儲空間
S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof (ElemType));
if (!S.base) exit (OVERFLOW); //存儲分配失敗
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}

format_input()
{int Finish=0,flag;
char ch;
while(!Finish)
{flag=0;
scanf("%c",&ch);
if(' '==ch)
else if(isalpha(ch)){
if(0==flag)
else
}
else
}
}

Creat_C_Stack()
{指向 M_Stack 內元素的指針p(用於指向一個單詞的最後字母),q(指向p的前方第一個空格元素);
指向 C_Stack 首行元素的指針C_i(),及隨後元素的C_i_j(insert_place);
q=M_Stack.top;
p=M_Stack.top;

i=0;
q=top;
p=top-1;
num=0;
while(1)
for(;q.elem!=' ';)
q--;
i=(p-q-1)/2;
Insert_P=C_Stack[num];
Insert_P.elem=p.elem;
p--;
for(j=0;j<i;j--)
Insert_P.next=Insert_P.next;
Insert_P.elem=p.elem;
p--;
if(q==M_Stack) return;
}
Sort()
{C_Stack C_p=C_Stack[j],C_q=C_Stack[j+1],C_Temp;
for(C_p.next!=NULL&&C_q.next!=NULL)
{if(C_p.elem!=C_q.elem){
if(C_p.elem>C_q.elem){
C_temp=C_p;C_q=C_p;C_p=C_temp;
}
else
}
}
}
output()
{for(i=0;i<C_num;i++){
q=C_Stack[i];printf("%c",q.elem);
for(q.next!=NULL){
q=q.next;
printf("%c",q.elem);
}
}
}

#include<stdio.h>
void main()
{printf("只有空格和字母為有效字元,\n");
printf("其他字元將使輸入結束。\n");
format_input();
Creat_C_Stack();
Sort();
Output();
}

J. C語言指針編程題,求助大神解答

#include<stdio.h>

int a[200];

void rotateArray(int *a,int n,int m){

m%=n; //這句是防止m大於n 結果會不正確的情況

for(int i=m;i<n;++i)scanf("%d",&a[i]);

for(int i=0;i<m;++i)scanf("%d",&a[i]);


}

int main(){

int n,m;

scanf("%d%d",&n,&m);

rotateArray(a,n,m);

printf("%d",a[0]);

for(int i=1;i<n;++i)printf(",%d",a[i]);

return 0;

}

熱點內容
如何重置手機密碼realme 發布:2024-05-06 14:57:25 瀏覽:347
自己搭建外網伺服器違法嗎 發布:2024-05-06 14:56:32 瀏覽:629
蘋果安卓哪個步數准確 發布:2024-05-06 14:43:58 瀏覽:239
安卓手機軟體用什麼編程語言寫 發布:2024-05-06 14:30:07 瀏覽:657
des解密python 發布:2024-05-06 14:30:06 瀏覽:684
n的階乘演算法 發布:2024-05-06 14:29:57 瀏覽:552
安卓手機為什麼停服 發布:2024-05-06 14:29:08 瀏覽:93
電腦伺服器不運行是怎麼回事 發布:2024-05-06 14:20:28 瀏覽:791
肥皂板解壓視頻大全 發布:2024-05-06 14:20:27 瀏覽:260
ps4各個伺服器有什麼區別 發布:2024-05-06 14:10:38 瀏覽:485