天天看點

c語言後繼指針,C語言--指針(一)

c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,C語言--指針(一)
c語言後繼指針,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

",p,sizeof(p));

//

// char *q = 0*1000;

// printf("%p %lu

",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

",p);

// printf("&a=%p

",&a);

printf("%d",*p);

//

// char b = 'a';

// char *q = &b;

// printf("%p %lu

",q,sizeof(q));

//整型等于整型位址,字元型等于字元型位址

//沒有誰是猜的位址,&取位址符,去整型,就是整型指針....

//*p 取值符 位址裡存放的内容

//取多少位元組取決于類型修飾符

// printf("%d

",*p);//*p 取值運算符 用于擷取 指針相應的值

// printf("%d %c

",*p,*q);

//擷取位址兩種途徑

//第一,直接給位址

//第二,用取值符号&來取

#pragma mark-------------指針變量的指派,代表指針變量的重指向

//指針變量指向

//指針變量的指派,代表指針變量的重指向

//注意

//不要讓整型指向字元型

//也不要讓字元型指向整型

// p = &b;錯誤

// int a = 10;

// int *p = &a;

// printf("指針p存放的位址: %p 指針p占用的記憶體空間大小:%lu 這個記憶體空間裡存放的值: %d

",p,sizeof(p),*p);

// //p自己也占記憶體

// //它們都放在棧區,一個一個配置設定記憶體

// printf("p自己的位址: %p

",&p);

// int b = 20;

// p = &b;

// printf("指針p儲存的新位址:%p 新的記憶體空間裡存放的值 %d

",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

",arr);

// printf("%p

",&arr[0]);

// int *p = arr;

// printf("%d

",*p);

// printf("%d

",*(p+1));

// printf("---%d

",p[1]);

// arr[1]=8;//直接改值

// *(p+1)=7;//間接改值

// printf("%d

",*(p+1));

#pragma mark-------------數組去*号加[]原則,把數字擴出來

// printf("%d

",*(p+1));

// printf("%d

",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("

%c",*(strings[1]+4));

// printf("

%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;

}