c语言08,C语言08 -- 指针
//
// main.m
// C8—指針
//
// Created by dllo on 15/7/9.
// Copyright (c) 2015年 Gaozi. All rights reserved.
//
import
import “MY FOUNDTION.h”
int main(int argc, const char * argv[]) {
模擬一次投票過程,對(duì)4個(gè)人投票,投票后對(duì)這四個(gè)人,根據(jù)票數(shù)從小到大進(jìn)行排序.
PERSON per1 = {“one”,0};
PERSON per2 = {“two”,0};
PERSON per3 = {“three”,0};
PERSON per4 = {“four”,0};
PERSON people[4] ={per1,per2,per3,per4};
vote(people, 3);
for (int i = 0; i < 4; i++) {
printf(“%d\n”,people[i].votenum);
}
// 指針
//訪問方式:1.直接訪問:直接通過變量名進(jìn)行訪問稱為直接訪問.
//2.匿名訪問:通過門牌號(hào),地址,一樣可以訪問到對(duì)應(yīng)的數(shù)據(jù),例如指針.(OC中絕大部分都是通過匿名訪問).
// 棧區(qū) – 放變量 -> int a = 0;長(zhǎng)度最長(zhǎng).
// 堆區(qū) – oc一般放在這;
// 全局靜態(tài)區(qū) -> 全局變量(state)
// 常量區(qū)
// 代碼區(qū) 最小
int a = 10;
// 取地符 —- & 打印用%p
printf("%p\n",&a);
//定義一個(gè)整型指針變量
int *p = NULL; // 空指針.
// int * 是類型,P是變量名,NULL是初始值.int* 在32位占4個(gè)字節(jié),64位占8個(gè)字節(jié).
printf(“%ld\n”,sizeof(int*));
p = &a;
printf(“%p\n”,p);//和a的地址一樣
// 取值符. -> * 打印用%d
printf(“%d\n”,*p);
printf(“%d\n”,*&a);
*p += 20;
printf(“%d\n”,*p);
int b =10, c = 20;
printf(“%d\n”,b+++c);// 結(jié)果是30
printf(“%d\n”,b);//結(jié)果 11
printf(“%d\n”,c);//結(jié)果 20
int a = 10,b = 20;
// 通過指針的方式讓兩個(gè)變量值發(fā)生交換
int *pa = &a;
int *pb = NULL;
pa = &a;
pb = &b;
/*
只交換了指針指向,沒有將值交換!
int *temp = pa;
pa = pb;
pb = temp;
printf(“%d\n”,a); 打印出來還是10,沒有交換.
*/
int temp = *pa;
*pa = *pb;
*pb = temp;
printf(“%d %d\n”,*pa,*pb);
// 通過指針來進(jìn)行操作,交換的不是指針,而是地址上的值.
int d = 0;
int *p = &d;
int * *p1 = &p;
int a = 10, b = 20,c = 30;
int arr[3] = {a,b,c};
for (int i = 0; i < 3; i++) {
// printf(“%d \n”,arr[i]);
}
printf(“%p\n”,&arr[0]);
printf(“%p\n”,&arr);
printf(“%p\n”,arr);
printf(“%p\n”,&a);
printf(“a = %d,arr[0] = %d\n”,a,arr[0]+20);
int a = 30,b = 40,c = 50,d = 60,e = 70;
int *arr[5] = {&a,&b,&c,&d,&e};
int arr[5] = {1,2,3,4,5};
int *p = arr;
printf(“%p\n”,arr);
printf(“%p\n”,p);
printf(“%d\n”,*arr);
printf(“%d\n”,*p);
// 這兩個(gè)打印的地址都是第一個(gè)1的地址,打印的取值都是1,那么,怎么打印出數(shù)組后面的元素呢?
// 指針的算術(shù)運(yùn)算.
int a = 30,b = 40,c = 50,d = 60,e = 70;
int *pa = &c;
printf(“%p\n”,&a);
printf(“%p\n”,&b);
printf(“%p\n”,&c);
printf(“%p\n”,&d);
printf(“%p\n”,&e);
printf(“%p\n”,(pa+1));// +1 即向上跳了四個(gè)字節(jié).
printf(“%p\n”,(pa));
int arr[4] = {2,3,1,5};
printf(“%p\n”,&arr[0]);
printf(“%p\n”,&arr[1]);
printf(“%p\n”,&arr[2]);
printf(“%d\n”,*(arr+3));
printf(“%d\n”,arr[3]);
int *p = arr;
printf(“%p\n”,p);
printf(“%d\n”,*(p+3));
printf(“%d\n”,p[3]);
語法糖:
作用就是提高代碼的可讀性,并且簡(jiǎn)化代碼.
// 冒泡函數(shù)
int *p = arr;
for (int i = 0; i < 4 - 1; i++) {
for (int j = 0; j < 4 - i -1; j++) {
if ((p+j)>(p+j+1)) {
int temp = *(p+j);
(p+j) =(p+j+1);
*(p+j+1) = temp;
}
}
}for (int i = 0; i < 4; i++) {
printf(“%d “,*(p+i));
}
printf(“\n”);
// 對(duì)指針的算術(shù)運(yùn)算相當(dāng)于控制指針跳轉(zhuǎn)的方向,++向高位移動(dòng),–向低位移動(dòng),而類型控制每次跳動(dòng)幾個(gè)字節(jié), int -> 4個(gè)字節(jié).
int a = 10;
text(&a);
printf(“主函數(shù)里a的地址:%p\n”,&a);
printf(“%d\n”,a);
// 通過傳地址才能在函數(shù)中改變主函數(shù)中a的值.
int a = 30,b = 40;
exchange(&a, &b);
printf(“a = %d,b = %d\n”,a,b);
char str[20] = “l(fā)fas6”;
char str1[20] = “iphone”;
char *p = str;
printf(“%s\n”,p);
printf(“%c\n”,p[1]);
// for (int i = 0; i < strlen(p); i++) {
// printf(“%c”,p[i]);
// }printf(“\n”);
//通過指針計(jì)算字符串長(zhǎng)度,strlen.
int len = 0;
for (int i = 0; i >= 0; i++) {
if (p[i] != ‘\0’) {
len++;
}else{
break;
}
}printf(“%d\n”,len);
for (int i = 0; p[i] != ‘\0’;i++) {
len++;
}printf(“%d\n”,len);
// 為什么不能夠?qū)rr[]不能直接取等?而結(jié)構(gòu)體可以.
// 因?yàn)閿?shù)組的名是第一個(gè)元素的首地址,這個(gè)地址是一個(gè)常量的地址,
int arr[2] = {1,2};
int a = 0;
int *p = arr;
p = &a;
// 指針重指向
,原來取的arr中第一個(gè)元素的地址,現(xiàn)在取a的地址.
char str1[20] = “l(fā)alala”;
char str2[20] = “haha”;
int *p1 = str1;
int *p2 = str2;
strcpy(str1, str2);
//printf(“%s\n”,str1);// %s 遇’\0’結(jié)束.不打印.
for (int i = 0; i < 20; i++) {
printf(“%c”,str1[i]);
}printf(“\n”);
// C語言使用前一定要重新賦值!
int t = test1();
int b = test2();
printf(“t = %d,b = %d\n”,t,b);
// 若是在test1()和test2()中間加一個(gè)printf,b的值就是0,
//因?yàn)椴皇沁B續(xù)調(diào)用了.
return 0;
}
//
// MY FOUNDTION.h
// C8—指針
//
// Created by dllo on 15/7/9.
// Copyright (c) 2015年 Gaozi. All rights reserved.
//
import
import “MY FOUNDTION.h”
void vote(PERSON people[], int personnum){
for (int i = 0; i < personnum; i++) {
char c = ‘0’;
scanf(“%c”,&c);
switch (c) {
case ‘A’:
people[0].votenum++;
// 清空格//
break;
case ‘B’:
people[1].votenum++;
break;
case ‘C’:
people[2].votenum++;
break;
case ‘D’:
people[3].votenum++;
break;
default:
personnum++;
printf(“輸入無效請(qǐng)重輸!\n”);
break;
}
}
}
void text(int *a){
// *a += 20;
printf(“.m中a的地址:%p\n”,a);
*a += 20;
}
void exchange(int *a ,int *b){
int temp = *a;
*a = *b;
*b = temp;
// 不交換地址,只交換內(nèi)容.
}
int test1(){
int g = 10;
return g;
}
int test2(){ int f; return f; } //并沒有對(duì)g賦值.但是連續(xù)調(diào)用,它使用的是同一塊內(nèi)存.可能就是沿用了其他的數(shù)據(jù),所以用之前需要重新賦值.
總結(jié)
以上是生活随笔為你收集整理的c语言08,C语言08 -- 指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pic单片机c语言存储器定义,PIC单片
- 下一篇: c语言有分数的怎么编,用C语言编程平均分