編輯:關於Android編程
C中比較難的這一塊,大概就是指針了,所以大家還是多翻閱一下資料,當然,如果只是想了解一下,看本篇也就夠了,不過我也盡量陳述的很詳細
要說指針,其實通俗易懂的話來說,他應該是保存內存地址的一個變量,我們來看一下小例子
#include
#include
main(){
//int 變量
int i ;
i = 5;
//打印i的值
printf("%d\n",i);
//打印i的內存地址
printf("%#x\n",&i);
//定義一個指針變量
//指針的含義是他是用來保存內存地址的
int * j;
j= &i;
//打印指針
printf("%#x",j);
//讓窗口停留
int age ;
scanf("%d",&age);
}
從這段話不難看出,我們定義一個i的話可以打印值和內存地址,但是我們定義一個指針j,也是可以賦值一個指針地址的,不信,我們打印一下
可以看到,內存地址是一樣的了,所以我們就可以清晰明了的知道了指針的概念了,指針指向的內存地址上村坊的數值是一個int類型
既然指針可以接收到內存地址,那他同樣是可以轉換成值的,我們繼續來看
//打印指針值
printf("%d",*j);
輸出一個指針int類型的值
就是5 了,*p指向內存地址上的值
二進指針的概念,他也是一個指針變量,二級指針存放的地址必須是一個一級指針,也就是j
//定義一個二進指針
int ** k;
//二級指針存放的地址必須是一個一級指針,也就是j
k = &j;
//輸出j的內存地址
printf("%#x\n",&j);
//打印二級指針‘
printf("%#x\n",k);
我們這段運行之後就是k的內存地址和j的是一樣的了
我們有時候會碰到一些梗,這都是需要注意到的,我們定義一個指針
//定義一個指針,在內存中開辟
int * i;
//打印i的內存地址
printf("%#x\n",i);
沒有給這個i賦值,但是可以打印
這裡我們就知道,指針已定義就會有一個值了,這個本身不是錯誤,但是如果你
*i = 3;
你就有錯誤了,因為定義的時候是隨機指向一個地址,你現在賦值這個地址為3,就錯誤了,正常是思路是
//定義一個指針,在內存中開辟
int * i;
i= 5;
//打印i的內存地址
printf("%#x\n",i);
*i = 3;
這樣輸出的才是3
所以我們得到的結論就是指針復制之前,不要是桶*i賦值,指針的類型也不能混用
這個概念在JAVA中也有,在排序中用到的比較多吧,其實就是定義一個中間變量去轉換,我寫個小例子大家就簡單明了了
#include
#include
main(){
//定義兩個變量
int i = 3;
int j = 5;
//定義中間變量
int temp = i; //temp = 3
i = j; // i = 5
j = temp; // j = 3
//讓窗口停留
int age ;
scanf("%d",&age);
}
這樣就把值給換過來了,不過這樣做沒什麼意義,我們用函數去簡化他,我們先來看下用JAVA的概念值傳遞是一個什麼樣式
#include
#include
void function(int i ,int j)
{
int temp = i;
i = j;
j = temp;
}
main(){
//定義兩個變量
int i = 3;
int j = 5;
//調用函數
function(i,j);
printf("i的值為:%d\n",i);
printf("j的值為:%d\n",j);
//讓窗口停留
int age ;
scanf("%d",&age);
}
用JAVA的思想,應該是這樣寫,我們來運行一下
然而你會發現,他們的值沒有變化,這是因為在C中,值傳遞本身不會對變量產生什麼影響,其實在JAVA中這樣也不會發生什麼改變,左右這裡就牽扯出來一個引用傳遞了,我們寫一個JAVA程序來打比方
/**
* 測試類
* @author LGL
*
*/
public class Test {
//定義兩個全局變量
int i = 3;
int j = 5;
public static void main(String[] args) {
Test test = new Test();
Function(test);
System.out.println(test.i);
System.out.println(test.j);
}
private static void Function(Test sTest){
int temp = sTest.i;
sTest.i = sTest.j;
sTest.j = temp;
}
}
用這個思想就可以把值轉換了
這就叫引用傳遞,但是再C中面向過程的思想是沒有對象的,所以傳地址也是可以實現的,我們試試看<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCjxwcmUgY2xhc3M9"brush:java;">
#include
#include void function(int* p ,int* q) { int temp = *p; *p = *q; *q = temp; } main(){ //定義兩個變量 int i = 3; int j = 5; //調用函數 function(&i,&j); printf("i的值為:%d\n",i); printf("j的值為:%d\n",j); //讓窗口停留 int age ; scanf("%d",&age); } 我們把內存地址傳過去之後,進行轉換,就可以了,運行如下
值傳遞和引用傳遞的概念
值傳遞:傳遞一個普通的值 引用傳遞:傳遞一個內存地址其實這些都應該叫值傳遞,只不過引用傳遞了一個地址罷了
四.指針返回值
指針是可以直接訪問硬件的 快速傳遞數據 返回一個以上的值 表示復雜的數據結構 方便處理字符串 指針有助於理解面向對象為什麼使用指針?
要是讓我們用JAVA去寫一個返回值,大家都是用return,很方便,但是再C中,她是可以返回多個值的,我們寫個例子
#include
#include void function(int* p , int* q) { //進行操作 *p = *p*2; *q = *q *2; } main(){ //定義兩個變量 int i = 3; int j = 5; //調用函數 function(&i,&j); printf("i的值為:%d\n",i); printf("j的值為:%d\n",j); //讓窗口停留 int age ; scanf("%d",&age); } 我們運行
你會發現他變了,這就是C可以返回多個值的概念了,他都可用直接操作了
好的,這篇閒到這裡,走到這裡,對C已經有一個模糊的印象了,但是還沒有摸到門檻,我們還得繼續加油才是!
本文實例講述了Android實現仿通訊錄側邊欄滑動SiderBar效果代碼。分享給大家供大家參考,具體如下:之前看到某些應用的側邊欄做得不錯,想想自己也弄一個出來,現在分
簡介屬性動畫是API 11新加入的特性,和View動畫不同,它對作用對象進行了擴展,屬性動畫可以對任意對象做動畫,也不像View動畫只支持四種簡單的變化。屬性動畫的默認時
前兩篇博客並分別講了獲取聯系人和通話記錄的知識,這篇主要介紹短信獲取知識,短信在通訊管理中應該說是一個難點,因為短信涉及到短息會話和短信詳情兩個部分,並且短信的數據量比較
生成apk最懶惰的方法是:只要你運行過android項目,到工作目錄的bin文件夾下就能找到與項目同名的apk文件,這種apk默認是已經使用debug用戶簽名的。如果想要