首页 > 代码库 > C语言(指针)
C语言(指针)
// main.m
// 1-22课堂笔记
// 讲师: 小辉
// 笔者: 王学文
// Created by lanouhn on 15/1/22.
// Copyright (c) 2015年 lanouhn. All rights reserved.
// pointer(指针)
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
/*
//指针:地址编号(类似于门牌号)
int a = 10;
//用&(取地址符号)来获取变量所分配内存的首地址编号
printf("%p\n", &a);
//指针变量:用于存储地址编号的变量
//定义格式
//数据类型 + 变量名 = 初值;
//注: 数据类型决定*p去内容是,取多少字节
//整形指针变量
//在定义指针变量时,*告诉编译器,这是一个指针变量
int *p = NULL;
printf("%p\n", p); //0x0
p = & a;
//直接访问: 通过变量a获取内存中的数据
printf("%d\n", a);
//间接访问: 通过指针p获取内存中的数据
//通过内存地址编号,找到内存,用*取出内存中的数据
printf("%d\n", *p);
*/
//当指针变量别重新赋值,意味着指针重定向
// int a = 10, b = 5;
// int *p1 = &a;
// int *p2 = &b;
// p1 = p2;
// printf("%d\n", *p1);
// int a = 15, b = 10;
// int * x = &a;
// int * y = &b;
// *x = 11;
// int *p = &a;
// p = y;
// *y = 8;
// printf("a = %d, b = %d\n", a, b);
// int a = 4, b = 8, c = 10;
// int * x = &a;
// x = &c;
// int *y = &b;
// int *z = &c;
// *z = 5;
// *x = 12;
// x = y;
// *y = *z + *x;
// printf("a: %d, b: %d, c: %d\n", a, b, c);
//内存地址编号比较低的存储单元 有操作系统控制,不允许访问
// int *p =NULL;
// *p = 100; //error
//2. 野指针, 定义指针变量没有赋初值
// int *p;
// *p = 5;
// printf("%d\n", *p);
//3.指针变量定义时, *怎么写
// int *p1 = NULL;//推荐
// int* p2 = NULL;
// int*p3 = NULL;
// int * p4 = NULL;
//指针变量所占的字节数
//1. 与数据类型无关
//2. 与操作系统的尾数有关, 32位下指针变量站4字节, 64位下指针变量占8字节
/*
printf("%lu\n", sizeof(char *));
printf("%lu\n", sizeof(short *));
printf("%lu\n", sizeof(int *));
printf("%lu\n", sizeof(long *));
printf("%lu\n", sizeof(float *));
int a = 130;
char *p = &a;
printf("%d\n", *p);
//位运算
//&: 按位与
//同1为1,否则为0
printf("%d\n", 9 & 5);
// | : 按位或
//同0为0, 否则为1
printf("%d\n", 9 | 5);
//^ 按位异或
//不同为1, 相同为0
printf("%d\n", 9 ^ 5);
//~: 取反
// 1变0, 0变1
printf("%d\n", ~9);
//<< : 左移
//向左移动,高位丢弃,地位补0
printf("%d\n", 3 << 4);
//右移
//向右移动, 符号位也移动,正数高位补0,负数高位补1;
printf("%d\n", 16 >> 3);
//注: 按位与, 按位或, 按位异或要求参与运算的数以 补码 形式 出现;
//原码: 是本身
//反码:
//1. 正数的反码是它本身
//2. 负数的反码是符号位不变,数值部分取反
//补码:
//数据是以补码的形式存储到内存中
//1. 正数补码是他本身
//2. 负数的补码: 符号位不变, 数值部分取反再加1
//数组在内存中是连续存储的
int array[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("%p\n", &array[i]);
}
//数组名字, 其实就是数组的首地址
//array 恒等于 & array[0]
printf("%p\n", array);
printf("%p\n", &array[0]);
int *p = array;
printf("%d\n", array[1]);
printf("%d\n", p[1]);
printf("%d\n", *(p + 1));
printf("%d\n", *(array + 1));
printf("%d\n", *(1 + array));
printf("%d\n", 1[array]);
//指针运算
//数据变量的数据类型还决定了 指针进行加1操作 跳转几个字节
int *p1 = NULL;
printf("%p\n", p1);
printf("%p\n", p1 + 1);
int array[5] = {1, 2, 3, 4, 5};
int *p = array;
*(p++) = 3;
*p = 5;
*(p + 1) = 8;
for (int i = 0; i < 5; i++) {
printf("%d", array[i]);
}
printf("\n");
//p + 1
//p++ 或者 ++p
//相同: 取到的都是下一个元素的首地址
//不同: ++p 或者 p++, 会让指针重定向
int array[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
// printf("%d", array[i]);
printf("%d", *(array + i));
} printf("\n");
//有10个元素的数组, 随机赋值,取值范围[22, 33]
int arr[10] = {0};
for (int i = 0; i < 10; i++) {
*(arr + i) = arc4random() % 12 + 22;
printf("%d ", *(arr + i));
} printf("\n");
BOOL flag = YES;
for (int i = 0; i < 10 - 1 && flag; i++) {
flag = NO;
for (int j = 0; j < 10 - 1 - i; j++) {
if ((*(arr + j) > *(arr+ j + 1))) {
int temp = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j +1) = temp;
flag = YES;
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", *(arr + i));
}
printf("\n");
*/
// int array[10] = {0};
// int *p = array;
//数组的名字(数组的首地址) 和 指向数组首地址的指针变量 的区别
//1. 数组名(数组首地址)是一个常量地址, 不能够修改
// int a = 5;
// array = &a;
//2. sizeof(), 如果是数组名(数组首地址), 计算的是数组所占的字节数; 如果是指针变量, 计算的是指针变量所占的字节数
// printf("%lu\n", sizeof(array));
// printf("%lu\n", sizeof(p));
//指针与字符串
//字符数组
//字符串
//字符串数组
// char string[] = "iphone";
// printf("%s\n", string);
// printf("%s\n", string + 3);
// char string[] = "I LOVE U!";
// *(string + 1) = ‘\0‘;
// *(string + 7) = ‘\0‘;
// printf("%s\n", string);
// printf("%s\n", string + 3);
// printf("%s\n", string + 7);
// printf("%s\n", string + 8);
// char string[] = "iPhone";
// *(string + 1) = ‘p‘;
// char str[] = "HAHA"; //数组名是常量地址, 不能够重定向
// string = str;
char *p = "iPhone";
// *(p + 1) = ‘p‘; //p指向常量区, 常量区的内容不能够修改
p = "HAHA";
printf("%s\n", p);
return 0;
}
C语言(指针)