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[]) {
模擬一次投票過程,對4個人投票,投票后對這四個人,根據票數從小到大進行排序.
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.直接訪問:直接通過變量名進行訪問稱為直接訪問.
//2.匿名訪問:通過門牌號,地址,一樣可以訪問到對應的數據,例如指針.(OC中絕大部分都是通過匿名訪問).
// 棧區 – 放變量 -> int a = 0;長度最長.
// 堆區 – oc一般放在這;
// 全局靜態區 -> 全局變量(state)
// 常量區
// 代碼區 最小
int a = 10;
// 取地符 —- & 打印用%p
printf("%p\n",&a);
//定義一個整型指針變量
int *p = NULL; // 空指針.
// int * 是類型,P是變量名,NULL是初始值.int* 在32位占4個字節,64位占8個字節.
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);// 結果是30
printf(“%d\n”,b);//結果 11
printf(“%d\n”,c);//結果 20
int a = 10,b = 20;
// 通過指針的方式讓兩個變量值發生交換
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);
// 通過指針來進行操作,交換的不是指針,而是地址上的值.
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);
// 這兩個打印的地址都是第一個1的地址,打印的取值都是1,那么,怎么打印出數組后面的元素呢?
// 指針的算術運算.
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 即向上跳了四個字節.
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]);
語法糖:
作用就是提高代碼的可讀性,并且簡化代碼.
// 冒泡函數
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”);
// 對指針的算術運算相當于控制指針跳轉的方向,++向高位移動,–向低位移動,而類型控制每次跳動幾個字節, int -> 4個字節.
int a = 10;
text(&a);
printf(“主函數里a的地址:%p\n”,&a);
printf(“%d\n”,a);
// 通過傳地址才能在函數中改變主函數中a的值.
int a = 30,b = 40;
exchange(&a, &b);
printf(“a = %d,b = %d\n”,a,b);
char str[20] = “lfas6”;
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”);
//通過指針計算字符串長度,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);
// 為什么不能夠對arr[]不能直接取等?而結構體可以.
// 因為數組的名是第一個元素的首地址,這個地址是一個常量的地址,
int arr[2] = {1,2};
int a = 0;
int *p = arr;
p = &a;
// 指針重指向
,原來取的arr中第一個元素的地址,現在取a的地址.
char str1[20] = “lalala”;
char str2[20] = “haha”;
int *p1 = str1;
int *p2 = str2;
strcpy(str1, str2);
//printf(“%s\n”,str1);// %s 遇’\0’結束.不打印.
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()中間加一個printf,b的值就是0,
//因為不是連續調用了.
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(“輸入無效請重輸!\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;
// 不交換地址,只交換內容.
}
int test1(){
int g = 10;
return g;
}
int test2(){ int f; return f; } //并沒有對g賦值.但是連續調用,它使用的是同一塊內存.可能就是沿用了其他的數據,所以用之前需要重新賦值.
總結
以上是生活随笔為你收集整理的c语言08,C语言08 -- 指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pic单片机c语言存储器定义,PIC单片
- 下一篇: c语言有分数的怎么编,用C语言编程平均分