段错误,无效空地址的指针的引用会发生错误。
const指针,
const int *p 与int* const p 区别:
前者是固定了指针所指地址内存中的数据不可变
后者是固定了指针地址不可变。
限制p,即固定了地址。
限制了*p就固定了数据。
野指针,地址有效但无可用数据。
*p++ = j+i;给指针*p赋值。
数组就是指针:(之间也有很大的区别,指针没有内存空间来存放数据,数组有内存空间可以存放数据)。
array[]是一维数组;
p = array;//p = &array[0]
int array[5];
array = array[0];
array[4] = *(array+4);
指针的下标形态:
int* p;
array[4] = p[4];
指针排序:
int flag = 0;
for(int i = 0;i<n;i++){
for(int j = 1;j<n-i;j++){
if(*p<*(p+j)){
flag = *p;
*p = *(p+j);
*(p+j) = flag;
}
}
printf("array[%d] = %d \n",i,*p);
p++;
}
指针+内存+char数组:
http://blog.csdn.net/iamfranter/article/details/6826248
添加头文件:#include<stdlib.h> free(viod);释放指针。
指针与数组的区别:
char* p = “hello”;
p[0] = ‘X’;//不能成功赋值:编译器不会觉得没有什么不妥,但是表达式企图改变常量值是不能够通过的。
char a[] = “hello”;
a[0] = ‘X’;//成功,这是数组的赋值,与指针相比,指针不会被分配内存,而数组可以被分配内存。所以 a[0] = ‘X’成功编译。
char数组的比较不能用“==”或“!=”,要用strcmp();而且赋值不能用a = b;而是要用:strcp(a,b);(把b赋值给a)。
计算内存容量sizeof(int);
char* p = “123”;
对strlen的掌握,它没有包括字符串末尾的’\0'。
char chr[3];
strcpy(chr,p);//出错,strcpy在为把“123”复制到chr之后结束时会把结束标示“\0”作为一个元素添加到chr中,如果chr的元素不够,便会出错。
而且如果一个数组中被重新全部赋值后(包括\0位),strcp()方法在操作时若是找不到“\0”标示符,strcpy会一直赋值下去,即便被赋值数组越界。
野指针:野指针不能够被使用,不可以被赋值。//int *p; *p = *pn; 或*pt = *p;都是不被允许的,因为野指针有可能指向系统区,而系统区的数据是不可以被更改的。
数组指针的使用。
#include<stdio.h>
#include<stdlib.h>
#include"time.h"
int main(){
char *p[5] = {NULL};
srand((unsigned)time(NULL));
0. //sum取1-10之间的整数;
int i,sum = rand()%10+1;
for(i = 0;i<sum;i++){
1. //给每个元素申请内存空间
p[i]=(char *)malloc(sizeof(char)*100);
2. //检查每个指针的值是否位NULL,NULL不可被使用(用来存储数据);
if(p[i]==NULL) break;
else scanf("%s",p[i]);
}
for (i=0; i<sum; i++) {
printf("%s\n",p[i]);
}
for(int i = 0;i<5;i++){
3. //指针数组使用完毕需要被释放内存
free(p[i]);
4. //被释放内存的指针数组需要被置空:NULL,防止产生野指针。
p[i] = NULL;
}
return 0;
}
内存分配:
内存的静态存储区:常量(值不可被修改)
栈上分配:局部变量(生存周期短,不可被return使用。)
堆上非配:user申请的,亲自申请的内存存储空间需要手动释放,要不然会造成内存泄露,而且释放之后的指针要置为NULL,要不然会生成野指针。
p+=6; p = p+6;
函数参数不超过4个。
数组指针:
#include<stdio.h>
#include<stdlib.h>
#include"time.h"
int main(){
int carray[2][5] = {2,6,8};
//int [5] carray[2];
//int [5] *pp;
int (*pp)[5] = NULL;
pp = carray;
//*pp = &carray[0];*(pp+1) = &carray[1];
printf("%d",*(carray[0]+1));
//看懂就懂了。
//pp = carray;
//carray默认等于carray[0]地址。
//*pp = carray = carray[0]
//*(pp+1) = carray[1]
//*pp+1 =carray[0]+1 = carray[0][1]
return 0;
}
详解:
*pp:指针变量指向内存中的数据
&pp:指针变量的地址
pp:指针变量所指向的地址(存储的地址)。
二位数组作为函数参数,a[][5]中的5不可少。否则报错。
数组指针PK指针数组?
数组指针:int (*p)[5]
可写成: int[5] *p
指针*p是一个指向数组int[5]的指针
指针数组:int* p[5]
一个包含5个指针的数组。
使用指针数组的元素来遍历数组元素。
#include<stdio.h>
#include<stdlib.h>
#include"time.h"
int main(){
int array[10] = {2,5,6,4,7};
int *parray[5] = {NULL,NULL,array+1};
//printf("parray[0] = %p",parray[0]);
for(int i= 0;i<5;i++){
printf("%d\n",*(parray[2]+i-1));
}
for(int i = 0;i<5;i++){
parray[i] = (int*)malloc(sizeof(int)*100);
}
for(int i = 0;i<5;i++){
free(parray[i]);
parray[i] =NULL;
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include"time.h"
int main(int a,char* arg[]){
// printf("%c\n",arg[1][2]);
// printf("%c\n",*(arg[2]+0));
// printf("%c\n",*(arg[2]+1));
//从arg[2]所指向字符串的第二个元素开始输出,直到结尾
printf("arg[2]+2 = %s\n",arg[2]+2);
//输出的时arg[2]所指向字符串的第二个元素。
printf("*(arg[2]+2) = %c\n”,*(arg[2]+2));
//从arg[3]所指向的第二元素开始输出,直到结尾
printf("arg[3]+2 = %s\n",arg[3]+2);
char arr[20] = "you are SB";
arg[4] = arr;
printf("arg[4]+4 = %s\n",arg[4]+4);
printf("arg[0]+132 = %s\n",arg[0]+132);
int array[10] = {2,5,6,4,7};
return 0;
}
使用指针数组:
可以选择从数组的某个元素开始遍历输出。
也可以输出单个数组元素。
一个指针数组的每一个元素可以用来遍历任意一个数组。
//从指定的字母开始读取后续字符串
方法一:
#include <stdio.h>
#include<stdlib.h>
char *p(char* s,char ch,int* ints);
int main(int argc, constchar * argv[]) {
int index =0;
char string_buffer[] ="hello world";
char* ret =NULL;
int i =1;
ret =p(string_buffer,'r', &index);
// while (*(ret+i)!='\0') {
// printf("%c",*(ret+i));
// i++;
// }
printf("\n%s\n",ret+1);
return0;
}
char *p(char *s,char ch,int* ints){
//排错:开始:
if(!s){
perror("char* s==NULL");
exit(-1);
}
if(!ch){
perror("char ch==NULL");
exit(-1);
}
if(!ints){
perror("int* ints == null");
exit(-1);
}
//排错:结束;
int i =0;
char* pp =NULL;
if(s[i]=='\0'){
perror("s[i]=='\0'");
exit(-1);
}
while (s[i]!=ch) {
pp = &s[i];
i++;
}
// printf("%s",pp);
return pp;
}
方法二:
#include<stdio.h>
#include<stdlib.h>
char *p(char* str,char* ch,int* index);
int main(){
char string_buffer[] ="hello world";
char ch =' ';
int* index =NULL;
char* prin =p(string_buffer, &ch, index);
printf("%s\n",(prin+1));
return0;
}
char *p(char* str,char* ch,int* index){
//排错:开始:
if(!str){
perror("char* s==NULL");
exit(-1);
}
if(!ch){
perror("char ch==NULL");
exit(-1);
}
if(!index){
perror("int* ints == null");
exit(-1);
}
//排错:结束;
printf("ch = ");
scanf("%s",ch);
printf("\n");
// ch = 'o';
int i =0;
while (str[i]!=*ch) {
index = (int*)&str[i];
i++;
}
printf("%s\n",(char*)index);
return (char*)index;
}
方法三:回调方法:
#include <stdio.h>
#include<stdlib.h>
typedefint (*phunt_t)(char* str,char* ch,int* index);
int operate(char* str,char* ch,phunt_t phunt);
int find(char* str,char* ch,int* index);
int main(){
char str_buf[] ="hello world";
char ch =' ';
int index =0;
int (*p)(char*,char*,int*);
p =find;
index=operate(str_buf, &ch, p);
printf("out index = %d\n",index);
for (int i = index; i<11; i++) {
printf("%c",str_buf[i]);
}
printf("\n");
return0;
}
int operate(char* str,char* ch,phunt_t phunt){
if(!str){
perror("str==NULL");
exit(-1);
}
if(!ch){
perror("ch==NULL");
exit(-1);
}
int index =0;
index = phunt(str,ch,&index);
printf("index = %d\n",index);
return index;
}
int find(char* str,char* ch,int* index){
if(!str){
perror("str==NULL");
exit(-1);
}
if(!ch){
perror("ch==NULL");
exit(-1);
}
if(*index!=0){
perror("*index!=0");
exit(-1);
}
printf("ch = ");
scanf("%s",ch);
printf("\n");
int i =0;
while (str[i]!=*ch) {
i++;
}
printf("inside index = %d\n",i);
for(int i = *index;i<11;i++){
printf("%c",str[i]);
}
printf("\n");
return i;
}
进出栈浅:
#include <stdlib.h>
#include <stdio.h>
typedefstruct stu {
int data;
structstu* node;
}phunt_t,*phunt;
int main(){
phunt put =NULL;
for(int i =0;i<6;i++){
phunt pp = (phunt)malloc(sizeof(phunt_t));
pp->data = i;
pp->node =put;
put = pp;
}
for(int i =0;i<6;i++){
printf("%d\n",put->data);
put = put->node;
}
return0;
}
把两串字符串合二为一:
#include <stdlib.h>
#include <stdio.h>
void join(char* a[]);
int main(void){
char* a[2] = {NULL};
// printf("%d",a[1]);
int i =0;
for(i =0;i<2;i++){
a[i] = (char*)malloc(sizeof(char)*100);
scanf("%s",a[i]);
}
join(a);
printf("%s\n",a[0]);
return0;
}
void join(char* a[]){
char* b[1] = {NULL};
char* p1 =NULL;
char* p2 =NULL;
char* p3 =NULL;
b[0] = (char*)malloc(sizeof(char)*100);
p3 = b[0];
p1 = a[0];
p2 = a[1];
int i =0,j =0,l =0;
while(p2[i]!='\0'){
while(p1[j]!='\0'){
// printf("%c\n",p1[j]);
p3[l] = p1[j];
l++;
j++;
if(p1[j]=='\0'){p1[j+1] = '\0';}
}
p3[l] = p2[i];
l++;
i++;
}
// printf("b[0] = %s\n",b[0]);
a[0] = b[0];
}
实现一个函数,传递一个字符数组,返回字符数组中的整数值,并在main函数中输出。
例如:
输入:134a231b
输出:134
输入:-129cde
输出:-129
#include <stdio.h>
#include <stdlib.h>
void cut(char* a[]);
int main(){
char* p[1] = {NULL};
p[0] = (char*)malloc(sizeof(char)*100);
scanf("%s",p[0]);
cut(p);
printf("%s\n",p[0]);
free(p[0]);
p[0] = NULL;
return 0;
}
void cut(char* a[]){
char* p = NULL;
p = a[0];
int i = 0;
//43-45/48-57
while ((p[i]<58&&p[i]>47)||(p[i]<46&&p[i]>42)) {
i++;
if (p[0] == '\0') {
break;
}
}
// printf("0 = %d 9 = %d '-' = %d '+' = %d \n",p[0],p[1],p[2],p[3]);
if (p[i]=='\0') {}
else p[i] = '\0';
}
实现一个函数,传递一个有10个已经排好序的整形元素数组(数组大小实际为11)中,将一个指定的值按顺序插入,并在main函数中将插入后的数组输出。
比如:
输入:
1 2 4 5 6 7 8 9 10 11
3
输出:
1 2 3 4 5 6 7 8 9 10 11
#include <stdio.h>
#include <stdlib.h>
void cut(int a[],int p);
int main(){
int a[11];
int n = 0;
int i = 0;
for(i = 0;i<10;i++){
scanf("%d",&a[i]);
}
scanf("%d",&n);
cut(a, n);
for (i= 0; i<11; i++) {
printf("%d",a[i]);
}
return 0;
}
void cut(int a[],int n){
int i = 0,j = 0;
if (a[i]<=n) {
while (a[i]<=n) {
i++;
}
int *pp = &a[i];
for (j = 11-i; j>=0; j--) {
*(pp+j) = *(pp+j-1);
}
*pp = n;
}
else{
while (a[i]>=n) {
i++;
}
int *pp = &a[i];
for (j = 11-i; j>=0; j--) {
*(pp+j) = *(pp+j-1);
}
*pp = n;
}
}
#include <stdio.h>
#include <stdlib.h>
void find(char* p[],char* pa[],int* n);
int main(){
char* p[1] = {NULL};
char* pa[1] = {NULL};
int n = 0;
p[0] = (char*)malloc(sizeof(char)*100);
pa[0] = (char*)malloc(sizeof(char)*100);
scanf("%s",p[0]);
scanf("%s",pa[0]);
find(p, pa, &n);
printf("%d\n",n);
return 0;
}
void find(char* p[],char* pa[],int* n){
int i = 0;
int j= 0;
int l = 0;
while (p[0][i]!='\0') {
l = i;
while (p[0][i]==pa[0][j]) {
j++;
printf("p[0][%d] = %c pa[0][%d] = %c\n",i+1,p[0][i+1],j,pa[0][j]);
if(p[0][i+1]!=pa[0][j])j = 0;
if (pa[0][j]=='\0') {
(*n)++;
j = 0;
}
i++;
}
i = l;
i++;
}
}