❶ c語言有個指針問題。我弄不懂
void swap(int *p1,int *p2)
當你調用這個函數時,如:swap(p2,p3);
實際上相當於 發生了如下初始化 int *p1=p2 , int *p2=p3;
這樣 函數裡面的p1,p2,的值就是p2,p3,的值了。而指針是間接訪問的這個知道吧。
那麼在函數裡面用p2訪問數據,和在主函數裡面用p3訪問數據,結果是一樣的。
因為p2和p3指向同一個地址。
另外說一下變數的作用域問題。解釋一下,所謂作用域就是變數有用的區域,也就是說,變數在這個區域內是有用的,在這個區域外是不能用的,也就是沒有這個變數
簡單點說,就是你在某一個函數裡面創建的變數只能在函數裡面用,也就是說,如果你在主函數裡面定義了 p1 p2,這兩個變數就只能用於主函數,在其它函數裡面不能用,如果用了的話,編譯器就會提醒你沒有定義這個變數。
同理,你上面的主函數、排序函數裡面都定義了兩個同名的指針變數 p1 p2,主函數里的p1 p2和排序函數里的p1 p2分別是兩個不同的變數,各自代表著不同的存儲空間。所以是不同的變數,只是同名罷了。。。不要再搞混淆了。
順便和你說一下全局變數這個東東吧。
全局變數就是在函數體之外定義的變數,就是說不屬於任意一個函數。它是所有函數都能用的。
是共享數據。不過如果你在某一個函數裡面有一個變數和全局變數同名的話,全局變數會被覆蓋掉,也就是說如果我有一個全局變數 some ,在我的一個函數int any(void)裡面也有一個變數 some ,那麼如果我在any 函數里用的some是any函數自己定義的而不是全局變數。
不過,全局變數不要經常用。。。因為共享數據很容易改,重要的是改完還不知道在哪裡改的。。。所以容易出錯,而且也容易跟同名的局部變數混淆,如上面的some。。。
最後,一時興起和你說一說所謂的函數調用吧。
當你調用函數的時候,系統會創建一個空間來執行函數操作。也就是說,函數的空間是在你調用的時候才創建的,而當你調用完函數之後,函數空間會被銷毀。所以呢,這樣會比較消耗時間,每一次都創建、銷毀。。。但是用函數的話可以讓你的代碼看起來美觀一點,便於閱讀,同時也便於維護。。。所以,其中的利弊要自己權衡了。
另外,因為函數空間用完就銷毀了,並且,由於作用域的存在。如果你的函數沒有返回值的話,你講得不到任何數據結果(當然,如果你這個函數僅僅是用來輸出的話除外)。並且,如果你用指針的話,也可以。因為指針式通過間接引用來進行操作的,這樣你在函數里的操作會直接作用到指針所指向的數據上——指針消除了作用域問題,實現了數據共享,但又不會產生全局變數那樣的問題。
不過指針也是很深奧、很危險的。。。它同時也是C語言的精華,也是C語言的缺陷。。。
貌似說太多了,希望能對你有用
危險與美麗共存
❷ 關於C語言指針的使用問題
這么寫其實是沒問題的。編譯不會有問題。
一般直接寫
int *addr=(int *)0x2000000;
*(addr++)=0x11;
....
但是以上都是理論,系統對一些地址比較敏感。
你要強制轉換的地址是否存在?這個地址是不是已經被別的程序佔用了?
你直接這樣訪問是很危險的,有些編譯器會直接報錯。
所以一般情況下,PC系統比較多的還是由系統分配地址。
❸ c語言中關於指針調用問題
首先最後是printf("%s\n",a)吧
形參char *p,通過fun(a,5)可知,p此時儲存的是數組a的首元素地址
進入fun函數,定義一個數組b[6]存放字元串"abcde",
緊著進入for循環,最開始初始化i為0,接著p=b表示將數組b的首元素地址賦值給p,
此時p被重新賦值了,之前傳入的數組a的首元素地址就沒有了意義,fun函數的操作(p[i]=b[i]
相當於b[i]=b[i]),不會對main函數造成影響,所以printf("%s\n",a)列印的就是最初的ABCDE
由此也可得知,p被第二次賦值,所以與a已經沒關系了,所以它的地址不會變,p只是儲存a地址的一個指針變數
❹ C語言指針問題,為什麼不能運行呢。
不知道你在程序中的意圖,猜測是字元指針傳遞地址傳遞到函數並實現在函數體內改變原字元指針的指向,根據這一點,程序只需要改一點:
int fun(char *a,char b,char *pa){
==>
int fun(char *a,char b,char **pa){
因為你在main()中定義的char *p是沒有存儲空間的,*pa=a+1會導致嚴重錯誤,以下代碼實現你的設想,在Turbo C 2.0調試通過,希望對你有幫助:
#include <stdio.h>
#include <alloc.h>
int fun(char *a,char b,char **pa){
int i;
for(i=0;a[i];i++){
if(a[i]==b){
*pa=a+i;
return 0;
}
}
*pa=0;
return 0;
}
void main(){
char a[]="abcdefg",b='h';
char *p;
fun(a,b,&p);
printf("%c\n",*p);
}
❺ C語言指針出了點問題
nclude <stdio.h>
d(int numtwo,int mtwo,int *p) ;
main()
{int num,m,n,a;
int *point;
for(num=1;num<=10000;num++)
{for(m=1;m<=num;m++)
d(num,m,point);
}
for(a=1;a<=1000;)
printf("%d\n",point++);
}
d(int numtwo,int mtwo,int *p)
{int a,b,c,d;
a=mtwo/1000;
b=(mtwo%1000)/100;
c=(mtwo%100)/10;
d=mtwo%10;
if(numtwo==mtwo+a+b+c+d)
{*p=numtwo;
p++;
}
}
-----------------------------------
1 d(int numtwo,mtwo,*p)
這樣定義是不正確的,要給每個參數都加上類型,改成:
d(int numtwo,int mtwo,int *p)
2 d(int numtwo,int mtwo,int *p)在mian函數前需要聲明
3 d(num,m,*point);第三個參數改為point,不需要星號,這里是要地址。
這樣後,編譯可以通過了。
❻ 關於C語言指針的問題
這個問題不好講清楚,首先所有函數間傳的都是拷貝,並不是本身,就算指針也一樣,你傳的只是指針的拷貝,而不是原來數據。你先要知道p1、p2分別是指向a、b的地址的指針,p1、p2本身也有地址(不是a、b的地址)。然後p1、p2也是變數,變數的值是a、b的地址,第一種情況:p1、p2的值(a、b的地址)被復制傳遞到了函數中,函數中p1、p2交換了,但是交換的是拷貝過來的地址,本身值並沒有改變,既然地址被交換了,你取裡面的值也就交換了。但這些操作只是對地址的拷貝操作,跟主函數沒有任何關系,所以主函數並沒有被交換。 第二種情況:地址被拷貝過來,然後你用*號,也就是取了地址裡面的東西然後交換,就算地址是拷貝的,但照這個地址取東西確實可以的,然後就主函數,子函數都交換了。就像你說北京和人們說的北京都是指首都。如:
【3000】
p = 5000;
【5000】
a
地址3000是p,p的值是5000,5000是一個地址,存放在5000這個地址的值是a。
可能不好理解,等你學的知識多了,就明白了。
❼ 寫了個C語言指針練習,一直調不通,有沒有大神幫我在VC上調一下保證成功運行,感激不盡。下面貼補充代碼
首先這個程序是要實現什麼功能?
代碼是編譯不通過還是結果非預期?
❽ C語言指針問題,本人菜鳥,不懂,請大蝦指教!!!!急
首先是編譯通不過
就算可以運行,結果是不確定的.
p是在堆棧中分配的內存.當GetMemory函數結束後,這些內存可能會被其它函數使用。
可能會覆蓋p,所以結果是不確定的.
堆棧是函數共用的,在一個函數中分配的內存,在函數結束後會釋放掉,在進入另一個函數時,分配的內存可能會與上一個函數分配的內存重疊。 這就造成了在這個函數中使用這段內存時,可能會覆蓋上個函數的內存,但也不一定會全部會覆蓋,這要看情況了。
下面是一個測試程序可以看看:
#include <stdio.h>
char *GetMemory(void)
{
char p[]="hello world";
return p;
}
void Test(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
}
int main(int argc, char* argv[])
{
Test();
return 0;
}
如果會匯編的話,反匯編,可以看一下匯編代碼什麼都會明白的.
❾ c語言指針問題,額~感覺指針好難,求高手解釋
第一個:你設置的字元指針指向的是一個字元串,在設置字元數組的時候例如p【】,這就是一個指針,p是地址,這個聲明方式等同於用*p來指向一個字元串。而實際應用中在不知道數組長度時,我們通常使用字元指針來指向一個字元串,節省空間。
所以輸出的時候,我們需要的是輸出目標的地址,p就是地址,不需要使用*號來代表地址。
第二個不要使用【】就可以了,因為p【】指代指針,或者*p指代指針,沒有同時使用兩個符號表示指針來指向一個字元串的。
❿ C語言指針 函數不能調用
#include<stdio.h>
#include<string.h>
voidfun(char*a,intk,intn)
{
inti,m=strlen(a);
for(i=k+n;i<m;i++)
a[k++]=a[i];
a[k]='';
for(i=0;i<m-n;i++)
{
printf("%c",a[i]);
}
}
voidmain()
{
intk,n;
chara[80];
printf("pleaseinputk: pleaseinputn: ");
scanf("%d%d",&k,&n);
getchar();//在上一條語句時鍵盤緩沖區還殘留有一個回車符(你輸入結束時按的enter),gets()直接讀取了這個回車符,
//所以這里要用getchar()將回車符清除。函數fun()是有調用。
printf("pleaseinputstring:");
gets(a);
fun(a,k,n);
}