待更新中.............
字符指针
字符指针:指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针指向一个字符串。
存放字符的字符指针
#include<stdio.h>
int main()
{
char ch = 'w';//(1)
char* pc = &ch;//(2)
*pc = 'w';//(3)
return 0;
}
- 1):开辟char类型变量为ch内存空间存放一个字符w;
- 2):将字符w地址存放在指针变量pc中(此时pc就是存放字符的指针也叫作字符指针)
- 3):pc解引用找到字符w
存放字符串的字符指针
int main()
{
? ?char* p = "hello world";//存放字符串的字符指针
? ?printf("%s\n", p);
? ?return 0;
}
答案是否定的。(字符串的指针):当一个字符串常量出现在表达式中时,它的值是个指针常量。编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针。
因为"hello,bit"这里是一个字符串常量是存在只读存储区的,地址存在于在进程的?text?段,text?段除了保存常量还保存可执行代码,因此是不允许可写权限的,而是只允许可读、可执行权限,内容不可改,所以,当指针指向这个字符串的时候,它指向的是字符串的首字符的地址,也就是第一个字符的地址。具体写这一行代码正确写法应该是:const char*p = "hello,world";(也正好吻合了指针指向的内容不可以改变)。
- 举个小例子来简单理解上面内容(这里是c和指针这本书的内容)
"xyz"+1,这个意思指针指向的是第一个字符的地址,加上1就是下一个字符的地址也就是y
*("xyz")指针指向的是第一个字符的地址解引用就是第一个字符也就是x
"xyz"[2]这个就是指向下标为2的字符也就是z
字符串的指针与字符数组比较
字符数组:当数组名用于表达式中时,它们的值也是个指针常量。我们可以对它们进行下标引用、间接访问以及指针运算。
int main()
{
? ?char p[] = "hello world";//存放字符串的字符数组
? ?return 0;
}
所有char字符都连续的存放在栈区。内容可更改!(也就是数组是存放在栈区上的而与字符串指针不一样它是存放在制度存储区的内容不可改)。
🎯来道笔试题
#include <stdio.h>
int main()
{
? ?char str1[] = "hello bit.";
? ?char str2[] = "hello bit.";
? ?const char *str3 = "hello bit.";
? ?const char *str4 = "hello bit.";
? ?if(str1 ==str2)
printf("str1 and str2 are same\n");
? ?else
printf("str1 and str2 are not same\n");
? ? ?
? ?if(str3 ==str4)
printf("str3 and str4 are same\n");
? ?else
printf("str3 and str4 are not same\n");
? ? ?
? ?return 0; }
先说str1和str2:
?
str3与str4:
因为str3和str4常量指针所指向的是常量字符串,常量字符串存储到单独的一个内存区域,当 几个指针,指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。
?
指针数组
指针数组是一个存放指针的数组。
整形指针数组:int*
arr1
[
4
]
#include<stdio.h>
int main()
{
int arr1[4] = { 1,2,3,4 };
int arr2[4] = { 2,3,4,5 };
int arr3[4] = { 3,4,5,6 };
int* arr[3] = { arr1,arr2,arr3 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
printf("%d ", *(*(arr + i) + j));
//arr[i][j]<==>*(*(arr + i) + j)
}
printf("\n");
}
return 0;
}
这里的得arr是指针数组,存放指针的数组,数组名是首元素地址,又因为指针就是地址,所以arr指针数组存放着三个数组首元素地址,当访问数组时访问的是这个数组的首元素地址,又因为数组在内存中是连续存放的,我们只要有首元素地址就可以访问一个数组中的所有元素。
?一级字符指针的数组:char* arr2[4]
#include<stdio.h>
int main()
{
//通过字符指针数组访问
char *str[] = { "zhangsan","lisi","wangerma" };
int sz = sizeof(str) / sizeof(str[0]);
for (int i = 0; i < sz; i++)
{
printf("%s ", str[i]);
}
return 0;
}
?二级字符指针的数组:char** arr3[5]
|