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个字节
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++;
}
}
}