ios学习记录 day10
1.指针 直接访问 //a = 20 间接访问 //通过地址访问内存内容
2.& 取地址 * 取内容 & 和 *配套使用 他俩正好相反
3.内存 栈区 从高向低分配 | 堆区 从低向高分配
1)、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2)、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3)、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另
一块区域。 - 程序结束后由系统释放。
4)、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5)、程序代码区—存放函数体的二进制代码。
int a = 5;
int b = 3;
int c = 2;
printf("%p\n%p\n%p\n",&a,&b,&c);
打印:0x7fff5fbff8bc
0x7fff5fbff8b8
0x7fff5fbff8b4
4.指针定义 类型 变量名 = 初值 int * p = NULL; //int * 是类型 NULL恒等于0
int a = 5;
int * p = NULL;
p = &a;
*p = 5;//通过地址改变量的值,相当于 a = 5
printf("%p\n",p);
printf("%d\n",*p);
int b = 3;
p = &b;//指针变量的赋值意味 重指向
5.int * p = 5;
*p = 6;//错误的 常量不可改!
6.不同类型的指针变量的区别: 指针的自增运算移动多少个字节 用*取值时取多少字节
内存地址大小只与操作系统有关:32位系统指针占4个字节,64位系统指针占8个字节
a恒等于&a[0]
7.数组名 首元素的首地址 指针可以当数组名使用
int array[5] = {4,7,1,2,9};
int * p = array;
*(p + 3) = 16;//p[3] = 16 //*(array + 3) //array[3] //等价
printf("%d\n",*(p + 3));
8.指针与数组区别 1)所占空间不同 2)数组名是常量地址不能重指向
9.指针与字符串
char str[] = "shenqingjun";
char * p = str;
printf("%s\n",p);
10.字符指针 操作字符 *(p+4)=v,操作字符串printf("%s\n",(p+1));
11.指针数组 (是数组 存放的指针) //数组指针 (是指针 指向数组)
char * str[4] = {"shenqingjun","zhaoyunlong","anyongxue","huaqiang"};
for (int i = 0 ; i < 4 - 1; i++) {
for (int j = 0; j < 4 - i - 1; j++) {
if (strcmp(str[j], str[j + 1]) >0){//*str[j] > *str[j + 1]
char * temp = str[j];
str[j] = str[j + 1];
str[j + 1] = temp;
}
}
}
for (int i = 0; i < 4; i++) {
printf("%s\n",str[i]);
}
// char * temp = str[0];//*p 是内容
// str[0] = str[1];//换的是地址 内容不能换
// str[1] = temp;
课上练习:
面试题:1.有一字符串包含数字字母,编程去数字.1)要求在原字符串中操作2)使用指针处理
1) char s[] = "iP5he3";
char * p = s;
char * pp = s;
while (*p != '\0') {
if (!(*p >= '0' && *p <= '9')) {
*pp = *p;
pp++;
}
p++;
}
*pp = '\0';
printf("%s\n",s);
2)void myStrcpy(char * s1,char * s2){
while ((*s1++ = *s2++) != '\0');
}
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{char s[] = "iP5he3";
char * p = s;
while (*p != '\0') {
if ((*p >= '0' && *p <= '9')) {
myStrcpy(p,p + 1);
p--;
}
p++;
}
printf("%s\n",s);
return 0;
}
2.有一个字符串aabcabd 输出aabcd(相邻重复字母不去掉,不相邻的重复去掉)
char s1[] = "aabcabd";
char * p = s1;
char * p1 = s1;
char * p2 = s1;
int length = 0;
*p1 = *p;
p1++;
p++;
length++;
while(*p != '\0') {
p2 = s1;
for (int i = 0; i < length; i++) {
if (*p == *p2) {
break;
}
p2++;
}
if (p2 == p1) {
* p1 = *p;
p1++;
length++;
}
if (*p == *(p1-1) && p == p1) {
*p1 = *p;
p1++;
length++;
}
p++;
}
*p1 = '\0';
printf("%s\n",s1);
作业:
1、输入10个整数,将其中最小的数与第一个数对换,把最大的数和最后一个数对换,写3个函数:(1)输入10个数;(2)进行处理;(3)输出10个数。
void swap(int * a,int * b){
iint * temp = *a;
*a = *b;
*b = temp;
}
void shuru(int * array,int count){
for (int i = 0; i < count; i++) {
scanf("%d",array + i);
}
}
void duihuan(int * array,int count){
int * max = array;
int * min = array;
for (int i = 0; i < count; i++) {
if (*max < *(array + i)) {
max = array + i;
}
}
swap(max,array + count - 1);
for (int i = 0; i < count; i++) {
if (*min > *(array + i)) {
min = array + i;
}
}
swap(min,array);
}
void shuchu(int * array,int count){
for (int i = 0; i < count; i++) {
printf("%d ",*(array + i));
}
printf("\n");
}
int main(int argc, const char * argv[])
{
int array[10] = {0};
shuru(array, 10);
duihuan(array, 10);
shuchu(array, 10);
return 0;
}
2、在主函数中输入10个等长的字符串。用另一个函数对它们排序,然后在主函数输出10个已经排好的字符串。
void scanString(char * str[],int count){
for (int i = 0; i < count; i++) {
scanf("%s",str[i]);
}
}
void sort(char * array[],int count){
for (int i = 0 ; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (strcmp(array[j],array[j + 1]) > 0) {
char * temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{char *array[10] = {0};
char string[10][50] = {0};
for (int i = 0; i < 10; i++) {
array[i] = string[i];
}
scanString(array, 10);
sort(array, 10);
for (int i = 0; i < 10; i++) {
printf("%s ",array[i]);
}
return 0;
}
3.冒泡排序-指针操作
void bubblSort(int * array , int count){
for (int i = 0; i < count - 1; i++) {
int * pp = array;
for (int j = 0; j < count - i - 1; j++) {
if (*pp > *(pp + 1)) {
int temp = *pp;
*pp = *(pp + 1);
*(pp + 1) = temp;
}
pp++;
}
}
}