程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言--指針(一)

C語言--指針(一)

編輯:關於C語言

\\\\\\\\\\\\\

\\\


#import 
//交換函數
void swap(int x, int y)
{
    printf("x=%d,y=%d",x,y);
    int temp = 0;
    temp = x;
    x = y;
    y = temp;
    printf("x=%d,y=%d",x,y);
    
    
}

//
void swap2(int *x , int *y)
{
    //不改地址,改地址對應的值
    printf("x=%d,y=%d",*x,*y);
    int temp = 0;
    temp = *x;
    *x = *y;
    *y = temp;
    printf("x=%d,y=%d",*x,*y);
}

int main(int argc, const char * argv[])
{
    
    
    //C語言定義指針的時候,喜歡使用p,q,r等;
    //類型是int*
    //變量名p
    //初值NULL恆等於0
//    int *p = NULL;
//    //打印指針%p
//    printf("%p %lu\n",p,sizeof(p));
//    
//    char *q = 0*1000;
//    printf("%p %lu\n ",q,sizeof(q));
    
    
#pragma mark---------指針總結
    //我們通常所說的指針,指的是指針變量,
    //指針變量是存放, 內存地址 (內存編號)的變量.
    
    //32位,8個0或1表示每8位一個字節
    //指針占用的內存都一樣,指針變量占用的內存不一樣
    
    //p和q所占內存一樣,因為都是32或64位系統下的首地址,都占那麼多,而int,char決定長度不一樣,int占四間房,char就占1間房
    
    //取地址符,是知道int a = 3,a值是3, int *P想指向內存中a = 3,這時候有了取地址符&a,就是a的首地址,
//    int a = 3;
//    int *p = &a;
//    printf("p=%p\n",p);
//    printf("&a=%p\n",&a);
////    printf("%d",*p);
//    
//    char b = 'a';
//    char *q = &b;
//    printf("%p %lu\n",q,sizeof(q));
    //整型等於整型地址,字符型等於字符型地址
    //沒有誰是猜的地址,&取地址符,去整型,就是整型指針....
    
    //*p 取值符 地址裡存放的內容
    //取多少字節取決於類型修飾符
//    printf("%d \n",*p);//*p 取值運算符  用於獲取 指針對應的值
//    printf("%d %c\n",*p,*q);
    
    
    //獲取地址兩種途徑
    //第一,直接給地址
    //第二,用取值符號&來取
#pragma mark-------------指針變量的賦值,代表指針變量的重指向
    //指針變量指向
    //指針變量的賦值,代表指針變量的重指向
    //注意
    //不要讓整型指向字符型
    //也不要讓字符型指向整型
//    p = &b;錯誤
    
    
    
//    int a = 10;
//    int *p = &a;
//    printf("指針p存放的地址: %p 指針p占用的內存空間大小:%lu 這個內存空間裡存放的值: %d\n",p,sizeof(p),*p);
//    //p自己也占內存
//    //它們都放在棧區,一個一個分配內存
//    printf("p自己的地址: %p\n",&p);
//    int b = 20;
//    p = &b;
//    printf("指針p保存的新地址:%p 新的內存空間裡存放的值 %d\n",p,*p);
    
#pragma mark-------------指針的算術運算
    //只有加減運算
    //int * p = &a;
    //P++;向高位移動四個字節
    //p--;向低位移動4個字節
    
    //p每加一代表加了這麼大類型
    //p++//向高位移動四個字節
    //p+1//沒有變
    //*(p++)
    //*(p+1)
    
    //int * p = &a;僅僅告訴編輯器 p是一個指針
    
    //*p = 20;操作符,取地址對應的值
    
    //p 指針(地址) *p取值 &p地址 &(*P)地址
    
#pragma mark-------------數組與指針
//    int arr[5]={9,2,3,4,5};
//    printf("%p\n",arr);
//    printf("%p\n",&arr[0]);
//    int *p = arr;
//    printf("%d\n",*p);
//    printf("%d\n",*(p+1));
//    printf("---%d\n",p[1]);
//    arr[1]=8;//直接改值
//    *(p+1)=7;//間接改值
//    printf("%d\n",*(p+1));
#pragma mark-------------數組去*號加[]原則,把數字擴出來
//    printf("%d\n",*(p+1));
//    printf("%d\n",p[1]);
    
    //p[2] *(p+2) arr[2]
//    p=arr+3;//指針變量是變量,可以重指向(賦值)
    //arr = p;數組名是一個常量指針,不可以改變賦值.
    
    //通過數組元素求數組元素個數,sizeof(a)/4

    
//    short a[4]={3,7,9,1};
//    int  *p1 = a;
//    char *p2 = a;
//    printf("%d",*p1);
//    printf("%d",*p2);
    
#pragma mark-------------字符串與指針
    //可以操作單個字符,     *(p+2)='z';
    //也可以操作整個字符串   printf("%s",(p+2));
//    char str[]="iPhone";
//    char* p = str;
//    *(p+2)='z';
//    printf("%s",(p+2));
#pragma mark-------------指針數組
    //存放指針的數組是指針數組
    //常量區
    //棧區.拷貝常量區
    
//    char *p1 = "iPhone";
//    char *p2 = "Android";
//    char *p3 = "win8";
//    char *strings[3]={p1,p2,p3};
    
    // char *strings[3]={"iphone","Android","win8"};
    //操作整個字符串
    //打印指針數組(指針字符串)
//    for (int i = 0; i<3; i++) {
//        printf("%s ",strings[i]);
//    }
//    printf("%s,%s,%s",strings[0],strings[1],strings[2]);
    //操作單個字符串
//    *(strings[1]+4) = 'x';//指向常量,不能賦值
//    char c = *(strings[1]+4);
//    printf("\n %c",*(strings[1]+4));
//    printf("\n %c",strings[1][4]);
    //
    
#pragma mark-------------指針與函數
    //改變不了值,因為是你壓根沒有改變a,b,而是改變它的副本x,y
    int a = 10,b = 20;
//    swap(a, b);
//    printf("%d,%d",a,b);
//    int *p = &a;
//    int *q = &b;
//    swap2(p, q);
    //不改地址,改地址對應的值
    swap2(&a, &b);
    printf("a=%d,b=%d",a,b);
    //學好指針,需要多畫圖
    
    

    return 0;
}



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved