C语言第八天课堂笔记<详细+注释>

import

import “Function.h”

void exchageValue(int num1, int num2)
{
printf(“形参%p:\n”,&num1);
printf(“形参%p:\n”,&num2);
int temp = num1;
num1 = num2;
num2 =temp;

}
void add(int *a,int *b)
{
printf(“%d\n”,*a + *b);

}

int main(int argc, const char * argv[]) {

//  字节是内存中最小的存储单位
//  一个字节是8个二进制位

//  什么是访问变量
//  1.直接访问:通过变量名直接访问
//  2.间接访问:通过变量的地址(内存编号)访问变量

//  指针变量:保存的是地址
//  int  *p = NULL;
//  声明指针的事后 * 没有特殊意义 只是告诉编译器这是一个指针变量
//  int:表示 这个指针变量所指向那个的内存区域是一个整形存储区域 也就是说指针变量p所指向的内存区域里 储存的值是一个整形

// int a = 5;
// 声明一个指针变量
// int *p = NULL;
// 指针变量p 指向 a 的存储区域(地址)
// & 取地址符
// &a 取出变量a的地址
// p = &a;
// 打印地址的占位符 %p
// printf(“%p\n”,p);
// printf(“%p\n”,&a);

//  * 取值符
//  *p 表示指针变量p 所指向的地址里面所保存的值

// printf(“%d\n”,a);
// 通过指针变量p 来打印
// printf(“%d\n”,*p);

//  修改变量a的值

// a = 3; // 直接访问
// *p = 3; // 间接访问7
// printf(“%d\n”,*p);

//  打印指针变量所占的字节数
//  指针变量占用8个字节 不管你是什么数据类型的指针 只跟操作系统有关系

// char *x = NULL;
// printf(“%lu\n”,sizeof(x));

//  指针变量的赋值 相当于 指针的重指向
//  使用图示法
//  练习1:

// int num1 = 50;
// int num2 = 40;
// int *p1 = &num1;
// int *p2 = &num2;
// p2 = p1;
// *p2 = 100;
// printf(“%d\n”,num1); //100
// printf(“%d\n”,num2); //40
// printf(“%p\n”,p1);
// printf(“%p\n”,p2);
// printf(“%d\n”,*p1); //100
// printf(“%d\n”,*p2); //100
// 练习2

// int test1 = 20;
// int test2 = 38;
// int *p1 = &test2;
// *p1 = 290;
// p1 = &test1;
// test1 = 300;
// printf(“%d\n”,test1); //300
// printf(“%d\n”,test2); //290
// printf(“%d\n”,*p1); //300

//  指针的运算
//  地址里面的值 可以加减乘除
//  地址运算 只有加 和 减
//  地址加1 要看这个指针变量的数据类型
//  如果int 类型 地址加1 相当于 加4个字节
//  如果char 类型 地址加 1 相当于加一个字节
//

// short a = 3;
// short * p = &a;
// printf(“%p\n”,p);
// p++;
// printf(“%p\n”,p);

// int a = 3;
// int b = 5;
// int *p = &a;
// 系统在分配变量的内存时,不一定分配的是连续的
// 数组在分配内存时,肯定分配的是连续的内存区域
// printf(“%p\n”,&a);
// printf(“%p\n”,&b);
// p–; // 地址减4
// printf(“%p\n”,p);
// printf(“%p\n”,&b);
// printf(“%d”,b);

// *p的两种含义
// 指针变量定义时 只起修饰作⽤,告诉编译器p是指针
// 指针变量取值时 访问内存地址为p的存储区域

// int a = 50,b = 30;
// // 交换两个数
// swap(&a, &b);
// printf(“%d\n”,a);
// printf(“%d\n”,b);
//
// int num1 = 40,num2 = 30;
// printf(“原%p:\n”,&num1);
// printf(“原%p:\n”,&num2);

//  参数的传递 是实参向形参才进行的传递,是一个copy的过程 是一个值的传递 地址是不一样的
//  交换时本着一个原则 操作的变量的地址应该是一致的

// exchageValue(num1, num2);
// int c = 0,d = 0;
// printf(“请输入两个数:\n”);
// scanf(“%d %d”,&c,&d);
//
// add(&c, &d);
//

//  指针与数组

// int array[4] = {1, 3, 5, 7};
// printf(“%p\n”,&array[0]);
// printf(“%p\n”,array);
// 声明一个指针变量指向数组(数组的首元素)
// 数组的名字本身就是数组首元素的地址 不需要加&(取地址符)

//  取出数组中的元素方法
//  array[下标]
//  *(array + 下标)
//  利用指针变量p出去数组元素
//  p[下标]
//  *(p + 下标)


//  计算数组中的元素个数
//  数组中总的元素个数 = 数组总共占据的字节数 / 每个元素所占的字节数

// unsigned long int count = sizeof(array);
// printf(“%lu\n”,sizeof(array));
// count = sizeof(array[0]);
// printf(“%lu”,count);

//  通过指针变量p 能不能求出元素个数 ?   答案: 不能
//  指针变量占8字节 只跟操作系统有关

//  数组当函数参数时 传递的不是整个数组 传递的是数组元素的首地址(就是传递了一个指针)


//  指针与字符串

// char str1[] = “iphone”;
// char str2[] = {‘i’, ‘p’, ‘h’, ‘o’, ‘n’, ‘e’};
// char *p = str1;
// 1.利用指针打印字符串
// for (int i = 0; i < 6; i++) {
// printf(“%c\n”,*(p + i));
// }
// printf(“%s\n”,str1);
// printf(“%s\n”,p);
// 2.利用指针打印字符 h

// printf(“%c\n”,str1[2]);
// printf(“%c\n”,*(p + 2));
// printf(“%c\n”,p[2]);
// printf(“%c\n”,*(str1 + 2));

//  3.把h 更改为w
//  整体

// strcpy(str1, “ipwone”);
// printf(“%c\n”,str1[2]);
// printf(“%c\n”,*(p + 2));
// printf(“%c\n”,p[2]);
// printf(“%c\n”,*(str1 + 2));
// *(p + 2) = ‘w’;
// 单个
// printf(“%c\n”,str1[2]);
// printf(“%c\n”,*(p + 2));
// printf(“%c\n”,p[2]);
// printf(“%c\n”,*(str1 + 2));

//  通过指针计算字符串的长度
//  方法1 用\0判断,

// char str[] = “lutaotao”;
// char *p = str;
// int count = 0;
// while(*(p + count) != ‘\0’)
// {
// count++;
//
// }
// printf(“%d\n”,count);
//

//  方法2

// char str[] = “lutaotao”;
// char *p = str;
// int count = 0;
// while(*p != ‘\0’)
// {
// count++;
// p++;
//
// }
// printf(“%d\n”,count);

// char str[] = “lutaotao”;
// char *p = str;
// *(p ++) = ‘a’;
// printf(“%s\n”,str);
// printf(“%s\n”,p);

//  指针数组 数组当中保存的都是同一类型的数据 指针数组中保存的指针类型 保存的都是地址
//  常量字符串是不能被改变的
//  如果声明时 直接声明常量字符串 那么你是不能更改的,如果你声明时先声明一个字符串(这时这个字符串就不是常量字符串了,是从常量区拷贝 到 栈区),这时你就可以进行修改

// char str1[] = “iOS”;
// char str2[] = “Android”;
// char str3[] = “WinPhone”;
// char *strings[3] = { str1, str2, str3};
//
// // char *strings[3] = { “iOS”, “Android”, “WinPhone”};
// printf(“%s\n”,strings[0]);
// printf(“%s\n”,*strings);
// printf(“%s\n”,*(strings + 1));
// strcpy(*strings, “SOS”);
// printf(“%s\n”,*strings);
// 常量字符串是不能被改变的
// 如果声明时 直接声明常量字符串 那么你是不能更改的,如果你声明时先声明一个字符串(这时这个字符串就不是常量字符串了,是从常量区拷贝 到 栈区),这时你就可以进行修改

//  需求: 一个字符串 去除数字
/**
 *  思路: 
 1.遍历字符串
 2.取出每一个字符串判断是不是数字
 3.需要一个变量来遍历字符串
 4.需要一个变量来确定取出数字后每个字符的位置
 */
char str[] = "123sdf23asq4sf23se3";
char *p = str;
int i = 0;
int j = 0;
while (*(p + i) != '\0') {
    if (*(str + i) >= '0' && *(str + i) <= '9') {

    }else{
        *(str + j) = *(str + i);
        j++;

    }
    i++;
}
str[j] = '\0';

printf("%s\n",p);


return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值