c语言08,C语言08 -- 指针

本文详细介绍了C语言中的指针概念,通过模拟投票过程演示了如何使用指针对数组进行排序,并深入探讨了指针的访问方式、算术运算、数组与指针的关系以及函数间的参数传递。内容涵盖了直接访问、匿名访问、栈区与堆区的区别,以及指针算术、数组长度计算和函数参数交换等关键技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值