『壹』 c語言中如何把變數原始值改掉
把變數原始值改掉代碼如下:
voidmain(){
inti=1;
printf("valueofichangebefore%d
",i);//int類型的指針*p指針指向int變數i的內存地址。
int*p=&i;
//修改int指針指向的內存地址的值。
*p=2;
printf("valueofichangeafter%d
",i);
}
變數來源於數學,是計算機語言中能儲存計算結果或能表示值的抽象概念。變數可以通過變數名訪問。在指令式語言中,變數通常是可變的;但在純函數式語言(如Haskell)中,變數可能是不可變的。在一些語言中,變數可能被明確為是能表示可變狀態、具有存儲空間的抽象(如在Java和VisualBasic中);但另外一些語言可能使用其它概念(如C的對象)來指稱這種抽象,而不嚴格地定義「變數」的准確外延。
基本類型(基本數值、基本數據類型)是一種既非對象也無方法的數據。在JavaScript中,共有7種基本類型:string,number,bigint,boolean,null,undefined,symbol(ECMAScript2016新增)。多數情況下,基本類型直接代表了最底層的語言實現。所有基本類型的值都是不可改變的。但需要注意的是,基本類型本身和一個賦值為基本類型的變數的區別。變數會被賦予一個新值,而原值不能像數組、對象以及函數那樣被改變。
『貳』 c語言中用函數交換兩個變數的值
c語言中用函數交換兩個變數的值方法是先將變數賦值給中間變數,然後中間變數再賦值給另外一個變數,程序如下:
#include "Stdio.h"
#include "Conio.h"
void swap(int x,int y)
{
int t,m;
t=x; //變數x賦值給中間變數t
m=y; //變數y賦值給中間變數m
x=m; //中間變數m賦值給變數x,將y的值賦值給了x。
y=t; //中間變數t賦值給變數y,將x的值賦值給了y。
}
main()
{
int a,b;
a=1,b=2;
swap(a,b); //調用交換函數
printf("%d,%d",a,b);
getch();
}
(2)c語言改變數值擴展閱讀:
C語言的語法結構:
1、順序結構
順序結構的程序設計是最簡單的,只要按照解決問題的順序寫出相應的語句就行,它的執行順序是自上而下,依次執行。
例如:a = 3,b = 5,現交換a,b的值,這個問題就好像交換兩個杯子裡面的水,這當然要用到第三個杯子,假如第三個杯子是c,那麼正確的程序為:c = a; a = b; b = c;執行結果是a = 5,b = c = 3如果改變其順序,寫成:a = b; c = a; b =c;則執行結果就變成a = b = c = 5,不能達到預期的目的,初學者最容易犯這種錯誤。
順序結構可以獨立使用構成一個簡單的完整程序,常見的輸入、計算、輸出三步曲的程序就是順序結構。
2、選擇結構
對於要先做判斷再選擇的問題就要使用選擇結構。選擇結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。選擇結構的程序設計方法的關鍵在於構造合適的分支條件和分析程序流程,根據不同的程序流程選擇適當的選擇語句。
選擇結構適合於帶有邏輯或關系比較等條件判斷的計算,設計這類程序時往往都要先繪制其程序流程圖,然後根據程序流程寫出源程序,這樣做把程序設計分析與語言分開,使得問題簡單化,易於理解。程序流程圖是根據解題分析所繪制的程序執行流程圖。
3、循環結構
循環結構可以減少源程序重復書寫的工作量,用來描述重復執行某段演算法的問題,這是程序設計中最能發揮計算機特長的程序結構,C語言中提供四種循環,即goto循環、while循環、do while循環和for循環。
四種循環可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環,因為強制改變程序的順序經常會給程序的運行帶來不可預料的錯誤。
『叄』 C語言中,怎樣不用中間變數而互換兩個變數的值呢
有兩種方式可以不使用中間變數,交換同類型的變數a,b的值:
1 .使用加法操作
a+=b;
b=a-b;
a -= b;
2 .使用異或操作:
a^=b;
b^=a;
a^=b;
『肆』 C語言用指針變數去修改變數的值比變數直接賦值效率高嗎
對於你的例子,是否使用指針效率是一樣的,沒有區別。
指針的高效簡潔體現在對復雜對象的操作上,
高效,比如傳遞一個類,如果使用地址傳遞,實際上只傳遞一個int大小的地址,而對象傳遞,則需要大量的內存空間復制一個臨時對象。
簡潔,體現在代碼的靈活上,也不是針對單一的簡單數據類型操作,今後的編程中,你經常可以看到類似這樣的語句:while(*p++) {...} 代碼比不使用指針要簡潔。
『伍』 在C語言中什麼情況下變數的值會發生改變
既然是變數,就都可能會變。你讓它作加減乘除,當然就會變了。
你是想問變數的域嗎?
函數體(包括main函數)中定義的變數的有效期一般只在函數中有效,也會在函數每次被調用時臨時分配空間作為變數。函數結束後,變數對應的空間會被釋放(雖然有些編譯器不管這些,仍然能夠通過指針訪問到原數據,但是這是不安全的)。而static類型的變數只在函數第一次被調用時初始化,之後的調用將不再會初始化該變數
關於實參與形參:
C語言傳遞參數時,基本類型變數傳遞的僅僅是值,對應主函數體中的內存是不會被調用的函數直接訪問的。(指針那裡的swap那個例子很說明問題)。比如主函數裡面定義了一個a,調用的函數參數裡面有個a,然後主函數「把a傳進」調用的函數中——這種理解是錯誤的,應該是將a的值傳遞到調用函數私有的一個變數a中(也就是有兩個a)。
還有不懂的再問吧
『陸』 C語言中的指針為什麼會改變變數的值
回答: pa 指向的是a的地址 *pa 就相當於 變數a 這是指針的特性 追問: 也就說只要pa最後一次指向某一個變數值的地址以後、然後再改變*pa值、就等於說把pa最後一次指的那個變數值地址也同時改變了嗎? 回答: 不是改變地址 是改變pa最後一次指的那個變數的值 追問: 能不能用個形象生動通俗的例子講解一下。 回答: #include <stdio.h>int main(){int a, b;int *pa; a = 2;b = 2; printf("a: %d b: %d\n", a, b); printf("-------------------\n");pa = &a;*pa = 3;printf("pa指向a,*pa=3\n"); printf("a: %d b: %d\n", a, b); printf("-------------------\n"); pa = &b;*pa = 4;printf("pa指向b,*pa=4\n");}代碼最能說明問題
『柒』 C語言函數變數傳遞值修改!
直接傳入B的指針就行了
比如
intmain()
{
intvalue(intc);
inta;
intb;
a=1;
b=2;
value(&b);
}
intvalue(int*c)
{
*c=119;//這時b的值也修改成了119
}
『捌』 C語言中,變數賦值後被強制修改的原因
重點就在while循環啊,你要貼出while循環內做了什麼操作才行吧。
一個死循環很容易內存溢出,那導致你參數值被修改了就很正常了。
也就是你說的哪種情況,可能while內部對內存重新分配,覆蓋了
變數的地址的某一部分。
有時候bug的出現有可能跟代碼的關系並不是特別大,bug出現要記錄bug出現的環境和測試的用例。
在不能實現用戶環境和沒有測試用例的情況下,這種bug是很難找出或者重現的。
所以其實,外人的幫助並不會很大,而是你要通過項目的了解,從而按邏輯來推測,可能出現的原因和位置,然後針對推測來做測試。這樣兒才能有效的解決這類問題。
我們做軟體的時候最頭疼的就是客戶遇到bug,但是由於一些機密因素,我們沒法拿到客戶的環境,甚至測試的用例和root case,那我們就只能自己根據邏輯推測了。所以我們會盡量的log每一個可能出現問題的地方,便於bug的重現和定位。當然這些都是題外話,因為你這個項目我們沒法接觸,所以實在不知從何下手。
我有個建議,因為你分配空間的地方特別多,雖然有釋放,但是也有可能分配的時候覆蓋了那個變數,從而導致釋放的時候也給清空了,那麼變數的值隨機,就很有可能是負數。
所以你可以嘗試分配一個較大的空間,看能否覆蓋掉變數的空間。我感覺這方面的可能性比較大。
『玖』 C語言中到底如何通過地址值的傳送在被調函數中直接改變調用函數中變數的值,請解釋詳細一點
這個就是2種函數調用方式中的地址傳遞調用方式(另一種是傳值方式)。
下面通過具體的實例來說明傳地址調用方式:
#include<stdio.h>
voidswap(int*p1,int*p2)//交換兩個整數——交換形參值(地址)
{//實際上是改變p1與p2所指向的地址
int*temp;
temp=p1;
p1=p2;
p2=temp;
printf("交換後:x=%dy=%d ",*p1,*p2);
}
voidmain()
{
intx,y;
scanf("%d%d",&x,&y);
swap(&x,&y);//調用swap函數的時候,是將變數x和y的地址傳遞進去的,也就是使形參p1和p2分別指向變數x和y的地址,改變的實際上還是x和y的值,只不過是通過地址的變換來實現的
printf("交換前:x=%dy=%d ",x,y);
}
『拾』 C語言交換變數值的幾種方法
方法一:三變數交換。
#include<stdio.h>
intmain(void)
{
inta,b;
scanf("%d%d",&a,&b);
intt=a;a=b;b=t;
printf("%d%d ",a,b);
return0;
}
方法二:加減交換
#include<stdio.h>
intmain(void)
{
inta,b;
scanf("%d%d",&a,&b);
a=a+b;
b=a-b;
a=a-b;
printf("%d%d ",a,b);
return0;
}
方法三:異或交換
#include<stdio.h>
intmain(void)
{
inta,b;
scanf("%d%d",&a,&b);
a=a^b;b=b^a;a=a^b;//可寫成a^=b^=a^=b;
printf("%d%d ",a,b);
return0;
}
方法四(黑盒測試下):不交換
#include<stdio.h>
intmain(void)
{
inta,b;
scanf("%d%d",&a,&b);
printf("%d%d ",b,a);
return0;
}