C语言08 -- 指针

来源:互联网 发布:扫号软件 编辑:程序博客网 时间:2024/06/04 22:54

//
// 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赋值.但是连续调用,它使用的是同一块内存.可能就是沿用了其他的数据,所以用之前需要重新赋值.

0 0
原创粉丝点击