1、指針(續)
指針做函數參數,可以實現地址傳遞
//寫一個函數,將主函數中的變量a、b的值進行交換
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int fc(int *x)
{
*x = 100;
return 200;
}
int a = 10;
int b = 20;
NSLog(@"a=%d,b=%d", a, b);
swap(&a, &b);
NSLog(@"a=%d,b=%d", a, b);
x = 0;
int y = fc(&x);
NSLog(@"x=%d,y=%d", x, y);
指針作爲函數返回值的類型
#import <Foundation/Foundation.h>
int* add(int *x)
{
*x += 10;
return x;
}
int* get1()
{
int x = 12345;
return &x;//返回一個局部變量的地址時,該局部變量會被釋放,從而造成返回的地址變成無效地址
}
void get2()
{
int y = 54321;
}
int* get3()
{
static int x = 55555;
return &x;
}
int main()
{
@autoreleasepool {
int a = 0;
int *p1 = add(&a);
NSLog(@"%d", *p1);
p1 = get1();
get2();
NSLog(@"%d", *p1);
p1 = get3();
get2();
NSLog(@"%d", *p1);
}
return 0;
}
指針加減
#import <Foundation/Foundation.h>
int main()
{
@autoreleasepool {
int a[5] = {10,20,30,40,50};
int* p1 = &a[0];
NSLog(@"%d", *p1);
NSLog(@"%d", *(p1 + 1));
NSLog(@"%d", *(p1 + 3));
p1++;
NSLog(@"%d", *p1);
int* p2 = &a[4];
NSLog(@"%d", *p2);
NSLog(@"%d", *(p2 - 1));
NSLog(@"%d", *(p2 - 3));
p2--;
NSLog(@"%d", *p2);
int x = 100;//指針加減只能與數組配合使用,不能用於單個變量
p1 = &x;
p1 = &a[0];
int f = *(p1++);
NSLog(@"f=%d,*p1=%d", f, *p1);
f = *(++p1);
NSLog(@"f=%d,*p1=%d", f, *p1);
f = (*p1)++;
NSLog(@"f=%d,*p1=%d", f, *p1);
}
return 0;
}
指針變量的存儲空間,與操作系統的位數有關,位數除以8就是指針的字節數
#import <Foundation/Foundation.h>
int main()
{
@autoreleasepool {
int* p1;
NSLog(@"%lu", sizeof(p1));
float* p2;
NSLog(@"%lu", sizeof(p2));
double* p3;
NSLog(@"%lu", sizeof(p3));
char* p4;
NSLog(@"%lu", sizeof(p4));
}
return 0;
}
賦值,p[i]<=>*(p+i)
#import <Foundation/Foundation.h>
int main()
{
@autoreleasepool {
int a[10] = {1,2,3,4,5,6,7,8,9,0};
int* p = a;
NSLog(@"%d", a[0]);
NSLog(@"%d", *p);
NSLog(@"%d", a[1]);//a[1]<=>*(a+1)
NSLog(@"%d", *(a + 1));
NSLog(@"%d", *(p + 1));
NSLog(@"%d", p[1]);//p[1]<=>*(p+1)
for (int i = 0; i < 10; i++)
{
printf("%d ", p[i]);
}
printf("\n");
p = a;
for (int i = 0; i < 10; i++)
{
printf("%d ", *p++);
}
printf("\n");
p = a;//此句不可或缺
for (int i = 0; i < 10; i++)
{
//printf("%d ", *p);
//p++;
printf("%d ", p[0]);//p[0]<=>*(p+0)<=>*p
p++;
}
printf("\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", *(a + i));//a[i]
//printf("%d ", *a++);//常量數組名a不能做左值
}
printf("\n");
for (int i = 0; i < 10; i++)
{
//printf("%d ", a[i]);//a[i]<=>*(a+i)
printf("%d ", i[a]);//i[a]<=>*(i+a)
}
printf("\n");
}
return 0;
}
數組做函數形參
#import <Foundation/Foundation.h>
void fa(int data[10])//數組做形參時,會被編譯成指針。int* data;
{
NSLog(@"%lu", sizeof(data));
}
void print(int* data, int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", data[i]);
}
printf("\n");
}
//寫一個函數,將傳過來的數組的每個元素加1
void increment(int *a, int size)
{
for (int i = 0; i < size; i++)
{
a[i]++;
}
print(a, size);
}
int main()
{
@autoreleasepool {
int a[10] = {1,2,3,4,5,6,7,8,9,0};
NSLog(@"%lu", sizeof(a));
fa(a);
print(a, 10);
int b[5] = {10,20,30,40,50};
print(b, 5);
increment(a, 10);
print(a, 10);
increment(b, 5);
print(b, 5);
//C99新增的數組常量
increment((int[5]){11,22,33,44,55}, 5);
int *d = (int[10]){1,2,3,4,5,6,7,8,9,0};
print(d, 10);
}
return 0;
}
2、進程空間
進程:正在運行的可執行文件
進程的內存空間
代碼區:程序的源代碼(機器碼)、常量(只讀的)
數據區:全局變量和靜態變量
堆區:malloc申請的空間
棧區:局部變量、形參
3、字符串
用雙引號引起來的多個字符
存儲方式
字符數組
字符指針
char str1[] = "Hello";
str1[0] = 'h';
//str1 = "world";
char *str2 = "Hello";
//str2[0] = 'h';
str2 = "world";
字符串的鍵盤輸入
char str[100];
//char* str1;
NSLog(@"請輸入一個字符串:");
scanf("%s", str);
NSLog(@"%s", str);
字符串的庫函數
#import <Foundation/Foundation.h>
int main()
{
@autoreleasepool {
//字符串的賦值
char str1[100] = "Hello";
char str2[100];
strcpy(str2, str1);
NSLog(@"%s", str2);
char str3[5];
//strcpy(str3, str1);
//NSLog(@"%s", str3);
strncpy(str3, str1, 4);
NSLog(@"%s", str3);
//求字符串長度
NSLog(@"%lu", strlen(str1));
//字符串拼接
strcpy(str1, "Hello ");
strcpy(str2, "world!");
strcat(str1, str2);
NSLog(@"%s", str1);
strcpy(str3, "he");
//strcat(str3, str2);
strncat(str3, str2, 2);
NSLog(@"%s", str3);
//字符串比較
strcpy(str1, "Hello");
if (strcmp(str1, "Hello") == 0)
{
NSLog(@"兩個字符串相同");
}
}
return 0;
}
思考練習
1、從鍵盤輸入一個密碼,顯示密碼強度
包含大小寫字母數字還有其他字符的及密碼長度大於12,爲極強
包含大小寫字符數字其他字符但長度長度小於12爲強
包含大小寫字母數字其他字符中的三種爲中等爲中等
包含大小寫字母數字其他字符中的兩種一下爲弱
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
解析
#import <Foundation/Foundation.h>
int main()
{
@autoreleasepool {
char password[100];
NSLog(@"請輸入一個密碼:");
scanf("%s", password);
int upper = 0;//大寫字母
int lower = 0;//小寫字母
int digit = 0;//數字
int sign = 0;//其他字符
int length = 0;//密碼長度
for (int i = 0; password[i] != '\0'; i++)
{
if (password[i] >= 'A' && password[i] <= 'Z')
{
upper = 1;
}
else if (password[i] >= 'a' && password[i] <= 'z')
{
lower = 1;
}
else if (password[i] >= '0' && password[i] <= '9')
{
digit = 1;
}
else
{
sign = 1;
}
length++;
}
int sum = upper + lower + digit + sign;
if (sum == 4 && length > 11)
{
NSLog(@"極強");
}
else if (sum == 4)
{
NSLog(@"強");
}
else if (sum == 3)
{
NSLog(@"中等");
}
else if (sum == 2 || sum == 1)
{
NSLog(@"弱");
}
}
return 0;
}